1、重载运算符
void operator+(....) //重载"+"运算符
(1)如果是成员函数形式,那么必须是非static
(2)使用运算符必须重载,除了“=”、“&”、“,”这三个可直接使用,也可以重载。
(3)不能重载的运算符“.”、“.*”、“::”、“?:”
(4)重载不能改变运算符的优先级,不能改变结合律,不能改变运算符“元数”(操作数)
(5)不能创建新运算符
(6)不能改变运算符对基本类型对象操作的含义。重载只能对用户自定义类型对象或基本类型和用户自定义类型混合使用
2、相关运算符
如重载加法运算符 obj2 = obj2 + obj1
但是obj2 += obj1不成立,必须重载“+=”运算符才行。
3、成员函数和全局函数
(1)“()”、“[]”、“->”或任何赋值运算符重载,必须声明为类成员函数。其他运算符则都可以
(2)如果是成员函数,那么左边操作数(或唯一操作数)必须是该类的对象。否则用全局函数重载,如重载流操作“<<”。
(3)使用全局函数可以使重载的运算符有可交换性,即左右操作数可以交换。
(4)一元运算符可以重载为一个不带参数的非static成员函数或带一个参数的全局函数(全局函数的参数必须是该类的对象或引用)
(5)二元运算符可以重载为带一个参数的非static成员函数或带两个参数的全局函数(其中一个参数必须是该类的对象或引用)
4、自我赋值
如果出现自我赋值,而operator=未检测,那么函数会在赋值操作前删除动态内存,使指针指向已释放的内存卡,导致运行错误。
5、类型转换
c++基本类型可以互相转换,用户自定义类和基本类型或用户自定义类之间则不能。
转换运算符又称强制类型转换运算符:
classA::operator classB() const;
当编译器遇到static_cast(a)时(a是classA一个对象),会调用上面函数进行转换。
(1)转换构造函数:任何单一参数的构造函数都可以看成是转换构造函数
(2)转换运算符和转换构造函数有点事编译器可以隐式调用。
(3)在重载运算符函数中,这种自定义的类型转换只能隐式调用一级。
6、重载自增自减(++、--)
前置 class &operator++();
后置 class operator++(int);
后置函数中int参数为0,是一个哑值,仅为了区分前置和后置。
后置自增自减会产生临时对象,所以尽量使用前置自增自减。
7、禁止隐式转换
左右单参数构造函数都可以用做隐式类型转换。
但是如果有些这类构造函数不像被当成隐式转换构造函数,需要声明成explicit即可。
explicit只能用于声明单参数构造函数,声明其他构造函数或成员函数会编译错误。