运算符重载的限制
1、不能自创运算符 比如===,=<>=只能重载现有运算符
2、以下运算符不能重载
a.对象访问运算符. 例如 user.hp
b.作用域解析运算符:: 例如 std::cout
c.求大小的运算符sizeof 例如 sizeof(int)
d.条件运算符?: 例如 b=a>c?100:200
3、不能修改运算符本身的优先级,相关性
4、在c++17后,也不能修改运算符的操作数的计算顺序,c++17以前,编译器可以自由选择如何计算(未定义行为)
5、除了delete/delete[]和new/new[]外,不能对原生数据类型的其他运算符进行重载比如把char类型的+定义为-
6、除了new和delete以外,其他运算符的arity(运算符关联的操作数的个数或者是关联的参数)一律不能修改
运算符重载的原则
1、不要改变运算符的意义,比如把加法重载为减法
2、不建议重载逻辑运算符&&|| 取值运算符& 逗号运算符,
注意:重载后的逻辑运算符将不会进行短路测试,在c++17标准前,编译器可以自由决定先计算左操作数还是右操作数,在c++后计算的顺序规定为先计算左在计算右
运算符重载的正确姿势
语法:
二元运算符的重载
利用全局函数 返回类型 operator 运算符(类型 左操作数,类型 右操作数)
利用类的成员函数 返回类型 operator 运算符(类型 右操作数)
一元运算符的重载
利用全局函数 返回类型 operator 运算符(类型 操作数)
利用类的成员函数 返回类型 operator 运算符()
有的运算符只能重载为类的成员函数,有些运算符只能重载为全局函数,有些运算符既可以重载为类的成员函数又可以重载为全局函数。如果一个运算符既可以重载为成员函数又可以重载为全局函数。我们一般推荐重载为类的成员函数。因为类的成员函数可以是虚函数,单全局函数不能是虚函数,如果这个运算符不修改对象,应该将这个成员函数限定为const
运算符重载的参数一般可以传递值或者引用,大部分情况下,能够传递引用就不要传递值,对于不会修改的值最好是限定为const,某些时候要擅用使用右值引用&&
作为参数运算符重载的返回值一般来说可以是任何类型,但是尽量要符合运算符的愿意,比如把运算>符返回指针类型,把+返回bool类型,都不是很好的选择