一、运算符重载:
1、定义:
重载操作符是具有特殊函数名的函数,关键字operator后面接需要定义的 操作符符号。操作符重载也是一个函数,具有返回值和形参表。它的形参 数目与操作符的操作数目相同,使用运算符重载可以提高代码的可读性 返回值 operator 操作符(参数列表)
(1)可以重载的运算符(除了不可重载的运算符,其余的操作符都是可以重载的操作符)
(2)不可以重载的运算符
2、赋值运算符:
(1)编译器把运算符合成了,编译器可以识别两个对象,d2=d1把d1中的内容拷贝到d2,类似于拷贝构造函数,把一个对象的内容原封不动的拷贝到另一个对象。有的情况会产生问题:若是两个对象公用同一块内存空间,一个空间销毁,会使另外一个空间成为野指针。还存在内存泄漏
(2)显式的重载赋值运算符
1‘、使用类的成员函数来写,有一个隐藏的this指针,看起来只有一个参数,实际上有两个参数。不论是返回值还是参数的位置,若是给定一个类类型的对象,最好给成引用,引用的方式不用创造临时对象。赋值操作符右操作数不发生改变,所以参数最好用const修饰
class Date { public: Date(int year=290,int month=11,int day=1) :_year(year) , _month(month) , _day(day) { cout << "Date(int):" << this << endl; } Date(const Date &d) :_year(d._year) ,_month(d._month) , _day(d._day) { cout << "Date(const Date &):" << this << endl; } void operator=(const Date&d) { _year = d._year; _month = d._month; _day = d._day; } private: int _year; int _month; int _day; }; int main() { Date d1(122, 3, 4); Date d2; //Date d3(1223,4,5); //d1=d2=d3; d2 = d1; //d2.operator=(d1);//Date::operator=(&d2,&d1)d1:通过参数压栈传入,d2通过ecx寄存器传入 return 0; }
缺陷不能连续赋值:如:d1=d2=d3:d3赋值给d2,d2赋值给d1:d1.operator=(d2.operator=(d3))
方式2:返回左操作数
Date& operator=(const Date&d) { _year = d._year; _month = d._month; _day = d._day; return *this;//d外部实参的引用,this是当前对象, //this和d的生命周期都比函数的生命周期长,但是我们返回this指针,因为 //需要返回左操作数 }
缺陷:不能自己给自己赋值,如:d1=d1和Date d4=&d1;……d1=d4;
方式三:判断自己给自己赋值,即this与当前的地址是否相同
Date& operator=(const Date&d) { if (this!=&d) { _year = d._year; _month = d._month; _day = d._day; } return *this; }
3、注意
(1)不能通过连接其他符号来创建新的操作符:比如operator@
(2)重载操作符必须有一个类类型或者枚举类型的操作数
构造一个加法的函数位于全局范围(普通的成员函数)内,这个加法函数有几个参数,给出几个参数,没有隐式的this指针)
1‘直接返回左操作数加右操作数不成立,需要给定一个自定义类型
class Date { public: Date(int year=290,int month=11,int day=1) :_year(year) , _month(month) , _day(day) { cout << "Date(int):" << this << endl; } Date(const Date &d) :_year(d._year) ,_month(d._month) , _day(d._day) { cout << "Date(const Date &):" << this << endl; } private: int _year; int _month; int _day; }; int operator + (int left, int right) { return left + right; }因为+可以直接处理整形的加号,应该给一个自定义的类型:枚举就是自定义类型
enum DATA{ ONE, TWO, THREE }; int operator + (int left, DATA right) { return left + right; }