C++重载复合赋值运算符、算术运算符和关系运算符
来源:互联网 发布:虚拟商品自动发货源码 编辑:程序博客网 时间:2024/05/21 17:14
原文链接:http://blog.csdn.net/lyh__521/article/details/49622601
复合赋值运算符
形如‘*=’、‘+=’、‘/=’等这样的运算符称为复合赋值运算符,它们其实是算术运算和赋值运算的结合,即先执行算术运算,得到的值再赋值给左侧对象。
重载复合赋值运算符:
- 赋值运算符必须定义为类的成员,复合赋值运算符通常也应该定义为成员函数(但并不是必须这样)。
- 复合赋值运算符函数返回左侧对象的引用(为了与内置的复合赋值运算符保持一致)。
下面是一个例子:
//重载了 += 运算符#include<iostream>using namespace std;class Goods{ public: //构造函数 Goods(int x=0,double y=0.0){ num = x; money = y; } //重载复合赋值运算符 Goods &operator+=(const Goods &gd2){ num += gd2.num; money += gd2.money; return *this; } //打印类的内容 void print(){ cout<<num<<" "<<money<<endl; } private: int num; double money;};int main(){ Goods gd1(5,20); Goods gd2(10,40); //将类gd2加到类gd1上 gd1 += gd2; gd1.print(); return 0;}
重载算术运算符
形如 +、-、*、/、等这类的是算术运算符。
- 通常定义为非成员函数,这样可以允许对左侧或右侧的运算对象进行转换。例如: “hello”+string(“world”) 和 string(“hello”)+”world” 。
- 形参一般是常量的引用,因为不需要改变运算对象的状态。
- 一般在函数内定义一个局部变量保存运算结果,函数返回该局部变量的副本(见下面例子)。
- 一般声明为友元函数。
- 一般重载了算术运算符,同时也会重载复合赋值运算符(此时,应注意代码复用原则,使用复合赋值运算符定义算术运算符,见下面例子)。
将上面的类加入算术运算符:
//重载了 += 和 +#include<iostream>using namespace std;class Goods{ public: //构造函数 Goods(int x=0,double y=0.0){ num = x; money = y; } //重载复合赋值运算符+= Goods &operator+=(const Goods &gd2){ num += gd2.num; money += gd2.money; return *this; } //重载算术运算符+ friend Goods operator+(const Goods &gd1,const Goods &gd2); //打印类的内容 void print(){ cout<<num<<" "<<money<<endl; } private: int num; double money;};Goods operator+(const Goods &gd1,const Goods &gd2){ Goods tmp = gd1; //定义一个局部变量接收运算结果 tmp += gd2; //注意代码复用,使用已定义的复合赋值运算符 return tmp; //返回局部变量的副本}int main(){ Goods gd1(5,20); Goods gd2(10,40); //将类gd1 与 gd2 相加 (gd1 + gd2).print(); return 0;}
重载关系运算符
定义相等运算符
类通过定义相等运算符来检验两个对象是否相等,一般会比较对象的每一个数据成员,当所有对应的成员都相等是认为两个对象相等。
设计准则:
- 定义的相等运算符应该具有传递性,即若a==b 和 b==c都为真,则a==c为真。
- 一般定义了==运算符,同时也应该定义 operator != 。此时,应注意代码复用,不需要重复定义(见下面例子)。
- 一般定义为非成员函数。
//定义==和!=运算符 #include<iostream>#include<string>using namespace std;class Foo{ public: Foo(int x=0,string s=""){ num = x; name = s; }friend bool operator==(const Foo &f1,const Foo &f2);friend bool operator!=(const Foo &f1,const Foo &f2); private: int num; string name;};bool operator==(const Foo &f1,const Foo &f2){ return f1.num == f2.num && f1.name == f2.name;}bool operator!=(const Foo &f1,const Foo &f2){ //代码复用,使用定义好的== return !(f1==f2);}int main(){ Foo f1(1,"liu"); Foo f2(1,"zhang"); cout<<(f1 == f1)<<" "<<(f1 != f2)<<endl; return 0;}
除此之外,我们还可以为类定义 > 、< 关系运算符。
0 0
- C++重载复合赋值运算符、算术运算符和关系运算符
- c语言 转义符 算术运算符及赋值运算符 复合运算符 逗号运算式和表达式 关系运算符 逻辑运算符
- C语言运算优先级 简单记就是:! > 算术运算符 > 关系运算符 > && > || > 赋值运算符
- 重载算术运算符与重载赋值运算符
- 复合赋值运算符
- 赋值和算术运算符的重载(2):算术运算符 +
- 重载算术运算符
- 算术和关系运算符
- JS程序设计基础:变量,算术、关系、赋值、复合赋值、逻辑、位运算符与表达式
- 赋值和算术运算符的重载(1):赋值运算符 =
- C++:赋值运算符重载
- C#算术表达式与算术运算符,复合赋值运算符
- Java 运算符: 算术运算符 关系运算符 位运算符 逻辑运算符 赋值运算符 其他运算符
- 赋值,算术和一元运算符
- 重载赋值运算符
- 重载赋值运算符
- 重载赋值运算符
- 重载赋值运算符
- ZOJ 3856 Goldbach(FFT)
- Calendar类的使用
- NodeJS操作文件相关总结
- JAVA中Action层, Service层 ,modle层 和 Dao层的功能区分
- 单片机与组态王通信协议
- C++重载复合赋值运算符、算术运算符和关系运算符
- CloudSuite之Graph Analytics集群安装
- Flume几种监控方式
- test-01
- iOS完整学习路线图
- 组态王与单片机协议2
- 随意细解:OC -- 类的扩展
- 关于app启动动画如何做到第一次启动采用图片轮播,以后启动都只有1张图片的解决方案
- Hibernate中两种获取Session的方式