C++编程(六)运算符重载

文章目录

  • 一、概念
      • 1. 左值和右值
      • 2. 运算符重载
      • 3. 可以实现重载的运算符和不可以实现重载的运算符
  • 二、双目运算符
    • (一)说明
    • (二)实现
      • 1. 注意点
      • 2. 算术运算符
        • 成员函数版本
        • 全局函数版本
      • 3. 关系运算符
        • 成员函数版本
        • 全局函数版本
  • 三、赋值类
  • 四、单目类
  • 五、递增和自减类
    • (一)前自增自减运算符的重载
    • (二)后自增自减运算符的重载
  • 六、插入(>>)和提取(<<)运算符重载

一、概念

1. 左值和右值

左值:既可以在等号的左边也可以在等号的右边;
右值:只能放在等号的右边。

2. 运算符重载

给运算符赋予新的含义,让原本只能处理基本数据类型运算的运算符可以处理类对象之间的关系

运算符重载的本质就是函数重载
运算符重载的时候操作数的个数需要通过运算符来决定的

运算符版本分为全局函数版本和成员函数版本

3. 可以实现重载的运算符和不可以实现重载的运算符

在这里插入图片描述

二、双目运算符

(一)说明

L # R

L:左操作数
#:运算符
R:右操作数

对于左右操作数既可以是左值,也可以是右值
对于表达式结果必须是右值

(二)实现

1. 注意点

L # R
1. 成员函数版本
const 类名 operator#(const 类名& R)const{}第一个const修饰返回值,返回值是一个右值;第二个const修饰的是右操作数;第三个const修饰的是左操作数。
2. 全局函数版本
const 类名 operator#(const 类名 &L,const 类名 &R){};需要在类中声明为友元函数

2. 算术运算符

+-*/%取余

  • 注: 返回值被const修饰,是为了避免返回值被修改的情况
成员函数版本
#include <iostream>
using namespace std;
class Complex{
public://构造函数Complex(){} //在实现运算符重载的函数中需要用到无参构造函数Complex(int a,int b):m_a(a),m_b(b){}//运算符重载函数声明const Complex operator +(const Complex &R)const;void print(){cout<<m_a<<'+'<<m_b<<'i'<<endl;}
private:int m_a; //实部int m_b; //虚部
};
//运算符重载函数定义
const Complex Complex::operator+(const Complex &R) const{Complex temp;temp.m_a=this->m_a+R.m_a;temp.m_b=this->m_b+R.m_b;return temp;
}int main()
{Complex m(3,4);Complex n(1,2);Complex r=m+n;r.print();return 0;
}
全局函数版本
#include <iostream>
using namespace std;
class Complex{
public://构造函数Complex(){} //在实现运算符重载的函数中需要用到无参构造函数Complex(int a,int b):m_a(a),m_b(b){}//运算符重载函数声明friend const Complex operator + (const Complex &L,const Complex &R);void print(){cout<<m_a<<'+'<<m_b<<'i'<<endl;}
private:int m_a; //实部int m_b; //虚部
};
//运算符重载函数定义
const Complex operator + (const Complex &L,const Complex &R){Complex temp;temp.m_a=L.m_a+R.m_a;temp.m_b=L.m_b+R.m_b;return temp;
}int main()
{Complex m(3,4);Complex n(1,2);Complex r=m+n;r.print();return 0;
}

3. 关系运算符

>大于 <小于 ==等于 !=不等于 >=大于等于 <=小于等于

成员函数版本
#include <iostream>
using namespace std;
class Complex{
public://构造函数Complex(){} //在实现运算符重载的函数中需要用到无参构造函数Complex(int a,int b):m_a(a),m_b(b){}//运算符重载函数声明bool operator >(const Complex &R)const;void print(){cout<<m_a<<'+'<<m_b<<'i'<<endl;}
private:int m_a; //实部int m_b; //虚部
};
//运算符重载函数定义
bool Complex::operator>(const Complex &R) const{if(this->m_a>R.m_a && this->m_b>R.m_a)return true;return false;
}int main()
{Complex m(3,4);Complex n(1,2);if(m>n)cout<<"m>n"<<endl;elsecout<<"m<=n"<<endl;return 0;
}
全局函数版本
#include <iostream>
using namespace std;
class Complex{
public://构造函数Complex(){} //在实现运算符重载的函数中需要用到无参构造函数Complex(int a,int b):m_a(a),m_b(b){}//运算符重载函数声明friend bool operator >(const Complex &L,const Complex &R);void print(){cout<<m_a<<'+'<<m_b<<'i'<<endl;}
private:int m_a; //实部int m_b; //虚部
};
//运算符重载函数定义
bool operator >(const Complex &L,const Complex &R){if(L.m_a>R.m_a && L.m_b>R.m_a)return true;return false;
}int main()
{Complex m(3,4);Complex n(1,2);if(m>n)cout<<"m>n"<<endl;elsecout<<"m<=n"<<endl;return 0;
}

三、赋值类

+= -= /= %= &= ^= ‘<<=’ >>=
L # R
左操作数只能是一个左值
右操作数既可以是一个左值,也可以是一个右值
返回值是左操作数本身

成员函数版:
类名 &operator#(const 类名 &R){}

全局函数版:
类名 &operator#(类名 &L, const 类名 &R){}

  • 注:赋值运算符’='只能使用成员函数版本,因为编译器提供的特殊的成员函数,拷贝复制函数就是=运算符重载;
    且两个版本的重载函数不能同时出现,否则会造成歧义。

四、单目类

-(负) ~(取反) !(非)

表达式:
#O
操作数既可以是一个左值,也可以是一个右值
表达式的结果是一个右值

成员函数版:
const 类名 operator#(void)const;
第一个const是用来修饰返回值的
第二个const是用来修饰操作数

全局函数版:
const 类名 operator#(const 类名 &O)

五、递增和自减类

++a a++ a-- --a

(一)前自增自减运算符的重载

表达式:
#O
操作数是一个左值
返回值是一个左值

成员函数版本:
类名& operator#(void);

全局函数版本:
类名 operator#(类名& O)

前自增自减是先自增自减然后返回对象本身

Complex &Complex::operator++(void)
{++this->m_a;++this->m_b;return *this;
}
  • 注:此处返回值是一个左值,可以修改,因此不能用const修饰

(二)后自增自减运算符的重载

表达式:
#O
操作数是一个左值
返回值是一个右值

成员函数版本:
const 类名& operator#(哑元);

全局函数版本:
const 类名 operator#(类名& O,哑元)

后自增自减需要先返回值然后再做自增或自减,因此需要一个临时变量保存对象当前的值,然后对象再进行自增或者自减,运算符重载函数返回的是临时变量,当函数执行完毕后,临时变量的空间就被释放了,因此返回值是一个右值

const Complex Complex::operator ++(int){Complex temp;temp.m_a=this->m_a++;temp.m_b=this->m_b++;return temp;
}
  • 注:此处返回值是一个右值,不可以修改,因此使用const修饰

六、插入(>>)和提取(<<)运算符重载

#include <iostream>
istream:输入流类 cin
ostream:输出流类 cout

在对插入运算符和提取运算符做操作时要使用全局函数版本

istream& operator >> (istream &in,类名 &R);
左操作数是cin;
右操作数既可以是左值,也可以是右值;
返回值是一个左值,返回值类型是istream&

ostream& operator <<(ostream &out,类名 &R);
左操作数是cout;
右操作数既可以是左值,也可以是右值
返回值是一个左值,返回值类型是ostream&

#include <iostream>
using namespace std;
class Complex{
public://构造函数Complex(){} //在实现运算符重载的函数中需要用到无参构造函数Complex(int a,int b):m_a(a),m_b(b){}//运算符重载函数声明friend ostream &operator<<(ostream &out,Complex &O);friend istream &operator>>(istream &in,Complex &O);void print(){cout<<m_a<<'+'<<m_b<<'i'<<endl;}
private:int m_a; //实部int m_b; //虚部
};
//运算符重载函数定义
ostream &operator<<(ostream &out,Complex &O){char op;if(O.m_b<0)op='-';elseop='+';out<<O.m_a<<op<<O.m_b<<'i';return out;
}
istream &operator>>(istream &in,Complex &O){in>>O.m_a>>O.m_b;return in;
}int main()
{Complex m(3,4);cout<<m<<endl;Complex mm(0,0);cin>>mm;cout<<mm<<endl;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/864152.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

技术反诈指南丨央视报了!基于“AI换脸”的新型电信网络诈骗猖獗

目录 利用“AI换脸”技术的诈骗 技术上防范新型电信网络诈骗 内蒙古鄂尔多斯市居民李女士近日遭遇了一起新型电信网络诈骗案。诈骗团伙利用“AI换脸”技术&#xff0c;合成了与李女士老同学相似的视频通话&#xff0c;以此作为诈骗的关键手段&#xff0c;成功骗取李女士信任。 …

【linux】使用vnc连接远程桌面,需要安装tigervnc,并在服务端期待,然后在客户端使用tigervnc-viewer进行连接即可

vnc 远程设置方法 需要服务端安装软件&#xff1a; sudo apt install -y tigervnc-standalone-server# 先配置密码使用&#xff1a; tightvncpasswd启动服务&#xff0c;禁用本机 vncserver -localhost no -geometry 1924x1080 :1客户端安装软件&#xff1a; sudo apt insta…

小红书起号运营01

上次我们详细的分享了小红书怎么起号,说直白点就是,怎么开始行动,让你的想法落地。 这次的分享前提是你已经将你的发展路线也就是定位已经有了思路。 比如以现在的最火的或者最容易入门的母婴系列、装修系列以主要发展路线。 或者做一个技能博主:摄影博主、修家电等等 …

1974. 使用特殊打字机键入单词的最少时间

关键点&#xff1a; 无论数组的开头第一位是什么&#xff0c;总是从a开始的&#xff0c;从第一个字母向后走的时候有顺时针和逆时针&#xff0c;取最小值当从第一个字母开始走的时候&#xff0c;用当前位置替换a的作用 class Solution:def minTimeToType(self, word: str) -&g…

C#面:请写出C#中的单例模式

单例模式是一种常用的设计模式&#xff0c;它确保一个类只有一个实例&#xff0c;并提供一个全局访问点来访问该实例。 以下是一种常见的C#中的单例模式实现方式&#xff1a; public class Singleton {private static Singleton instance;private static readonly object loc…

实现资产优化管理:智慧校园资产分类功能解析

在构建智慧校园的过程中&#xff0c;细致入微的资产管理是确保教育资源高效运作的关键一环&#xff0c;而资产分类功能则扮演着举足轻重的角色。系统通过精心设计的分类体系&#xff0c;将校园内的各类资产&#xff0c;从昂贵的教学设备到日常使用的办公物资&#xff0c;乃至无…

嵌入式linux系统中动态链接库实现详解

大家好,linux系统中动态库是如何实现相互链接的?今天简单聊聊动态链接库的实现原理。 假设有这样两段代码,第一段代码定义了一个全量变量a以及函数foo,函数foo中引用了下一段代码中定义的全局变量b。 第二段代码定义了全局变量b以及main函数,同时在main函数中调用了第一个…

中英双语介绍美国的州:伊利诺伊州(Illinois)

中文版 伊利诺伊州&#xff08;Illinois&#xff09;位于美国中西部&#xff0c;是一个人口众多、经济发达的州。以下是对伊利诺伊州各方面的详细介绍&#xff1a; 发音&#xff1a; IIIinois&#xff1a;英 [ˌɪlɪˈnɔɪ] 人口 截至2020年&#xff0c;美国人口普查数据…

​Chrome插件:React Developer Tools为React开发调试而生

React Developer Tools 是什么? 它是允许在Chrome和Firefox开发者工具中检查React组件层次结构的扩展插件。 插件源码下载 源码下载地址:GitHub - facebook/react-devtools at v3 下载完成以后执行红框中的代码,下载react-devtools 源码,源码如下图所示: 插件打包 当前n…

表单外链,支持查看方式设置

06/19 主要更新模块概览 外链设置 跳转缩放 打印调整 数据校验 01 表单管理 1.1 【表单外链】-填写外链新增查看方式设置 说明&#xff1a; 原表单填写外链&#xff0c;填写字段权限和查看权限统一字段设置&#xff0c;用户在填写时看到数据与查看数据一致…

Qt 使用代码布局,而不使用UI布局

一、工程的建立&#xff1a; 1、打开Qt Creator&#xff0c;文件&#xff0c;新建文件或项目 2、选择Application&#xff0c;Qt Widgets Application 3、写入名称&#xff0c;选择qmake 4、选择基类Base class&#xff0c;去除Generate form 务必选择QWidget&#xff0c;若…

交友系统定制版源码| 相亲交友小程序源码全开源可二开_打造独特的社交交友系统

交友系统源码的实现涉及到多个方面&#xff0c;包括前端页面设计、后端逻辑处理、数据库设计以及用户交互等。以下是一个简单的交友系统源码实现的基本框架和关键步骤: 1.数据库设计:用户表:存储用户基本信息&#xff0c;如用户ID、用户名、密码、头像、性别、年龄、地理位置等…

『手撕Vue-CLI』 添加自定义指令

添加 create 指令 在 vue-cli 中&#xff0c;create 指令是用来创建一个新的项目的&#xff0c;我实现的 nue --help 的帮助信息中只有 --version&#xff0c;--help 这两个指令&#xff0c;所以当用户使用我的 nue-cli 时&#xff0c;并不知道有 create 这个指令&#xff0c;所…

深入解析Apache Flume:定义、架构、原理、应用场景及常用命令

引言 Apache Flume 是一个分布式、可靠且可用的服务&#xff0c;用于高效地收集、聚合和移动大量日志数据。作为一个大数据生态系统的重要组成部分&#xff0c;Flume 可以将数据从各种来源传输到一个集中存储平台&#xff0c;比如 Hadoop HDFS 或 HBase。本文将从 Flume 的定义…

【MySQL】事务实现原理

事务 事务是将一组SQL语句打包成一个整体&#xff0c;在这组SQL的执行过程中&#xff0c;要么全部成功&#xff0c;要么全部失败。这组SQL语句可以是一条也可以是多条。 如果转账成功&#xff0c;应该满足以下要求&#xff1a; 张三的账户余额减少100&#xff0c;变成900&…

C++03 字符串、向量、数组

字符串string 一些初始化string对象的方式&#xff1a; string str; //str是一个空字符串 string str1(str2); // str1是str2的副本 string str1 str2; // 等同于str1(str2) string str("val"); // str是"val"的副本 string str "val"; //等…

FeignClient配置

/***解释 primary 属性的含义&#xff1a;* 作为主要 Bean&#xff1a;* 当 primary 属性设置为 true 时&#xff08;默认值&#xff09;&#xff0c;Feign 代理将会被标记为主要的 Bean。这意味着&#xff0c;当存在多个同类型的 Bean 时&#xff0c;Spring IoC 容器会优先选择…

Vatee万腾平台:引领行业变革,创新未来

在当今这个快速变化的时代&#xff0c;科技的力量正在以前所未有的速度推动着行业的变革。Vatee万腾平台&#xff0c;以其独特的视角和前瞻性的布局&#xff0c;正引领着行业变革的浪潮&#xff0c;创新着未来的发展方向。 Vatee万腾平台是一家专注于科技研发和创新应用的领军企…

安装PyTorch详细过程(个人过程仅供参考)

1.安装anaconda 2.创建一个虚拟环境 以上步骤默认已经完毕&#xff0c;毕竟只是记录pytorch的安装过程 3.查看个人电脑CUDA版本 winr 输入cmd 回车 输入指令 nvidia-smi 右上角为该电脑所支持的最高CUDA版本 输入命令 nvcc -V 图中即为该电脑所安装的CUDA版本 记住该版…

struct 和 class 的异同

在C编程语言中&#xff0c;struct和class是两个定义数据类型的关键字。尽管它们看起来相似&#xff0c;但它们之间有一些关键的异同。 基本定义 struct struct是从C语言继承而来的&#xff0c;它用于定义一个结构体&#xff08;structure&#xff09;&#xff0c;结构体是由…