#define _CRT_SECURE_NO_WARNINGS 1 #includeusing namespace std; //运算符重载 //C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数, //,也具有其返回值类型、函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。 //函数名字为:关键字operator后面接需要重载的运算符符号。 //函数原型:返回值类型 operator操作符(参数列表) //*注意: //-不能通过连接其他符号来创建新的操作符:比如operator@ //-重载操作符必须有一个类类型或者枚举类型的操作数 //-用于内置类型的操作符,其含义不能改变,例如:内置的整型 + ,不能改变其含义 //-作为类成员的重载函数时,其形参看起来比操作数数目少1,成员函数的操作符有一个默认的形参this, //,限定为第一个形参 //-重载操作符大部分情况下是在类里定义成员函数,是为了方便解决访问私有成员变量的问题, //,因此若在全局与类内都定义了同样的重载,编译器一般会优先调用类里的 // .* :: sizeof ?: .注意以上5个运算符不能重载。这个知识点经常在笔试选择题中出现。 //注意 *可以重载而.*不行 //赋值运算符重载主要有四点: //1.参数类型 //2.返回值 //3.检测是否为自我赋值 //4.返回*yhis //5.一个类若未显式定义赋值运算符重载,编译器也会生成一个 // 编译器默认生成的赋值重载功能与拷贝构造类似: // 1.对内置类型成员回完成字节序值拷贝,即浅拷贝(比如日期类就可以直接用默认生成的) // 2.对自定义类型成员,会调用其自身的operator= //对于栈等浅拷贝不能满足需求的类型,需要自己实现赋值重载 //动态开辟的"基本"都需要深拷贝(智能指针和迭代器不需要) //总结: //构造和析构的处理机制基本类似 //拷贝构造和赋值重载的处理机制基本类似 class Date { public: Date(int year = 0, int month = 1, int day = 1) {//构造函数 _year = year; _month = month; _day = day; } //返回值类型 operator操作符(参数) //返回值类型取决于操作符运算后返回的值的类型,参数数量取决于操作符的操作数数量 bool operator>(const Date& d) { //成员函数会多一个隐含的参数:this指针,所以参数不能写成(const Date& d1, const Date& d2) //这里实际上是(Date* const this,const Date& d),d1传给this,d2传给d //然后一般不会写出this,所以if (this->_year > d._year)变成if (_year > d._year) if (_year > d._year) { return true; } else if (_year == d._year && _month > d._month) { return true; } else if (_year == d._year && _month == d._month && _day > d._day) { return true; } else { return false; } } //实现d1=d3赋值 Date& operator=(const Date& d) {//d1是this,d是d3的别名,最后返回d1 if (this != &d) {//优化极端情况下自我赋值的效率:判断左右操作数地址,相等则跳过操作 _year = d._year; _month = d._month; _day = d._day; } return *this;//返回给左操作数,不能直接返回this. //另,出作用域*this还在,传引用减少拷贝. } private://回顾:访问限定符限定的是来自类外的访问 int _year; int _month; int _day; }; int main() { Date d1(2022,4,9); Date d2(2022, 12, 31); Date d3(2022, 4, 12); //要获取某日期到另一日期的天数,不能直接d2-d1,C++默认不支持自定义对象使用运算符 cout <<(d1>d2)<< endl;//编译器会检测有无重载运算符,若有则调用,无则报错 //拷贝构造-用已存在的对象初始化马上要实例化的对象 Date d4(d1); Date d5 = d1; //赋值重载-两个已经存在的对象之间进行赋值拷贝 d1 = d3;//d1.operator=(d3); return 0; }


运算符重载 [C++笔记](赋值)运算符重载](http://www.mshxw.com/aiimages/31/849630.png)
