14.1 基本概念
当一个重载的运算符是成员函数时,
this
绑定到左侧运算对象,成员运算符函数的参数数量比运算对象的数量少一个
不能被重载的运算符:::
、.*
、.
、?:
data1 + data2; // 普通的表达式
operator+(data1, data2); // 等价的函数调用
data1 += data2; // 基于调用的表达式
data1.operator+=(data2); // 对成员运算符函数的等价调用
逻辑与&&
和逻辑或||
运算符的重载版本也无法保留内置运算符的短路求值属性,两个运算对象总是会被求值。所以不建议重载
通常不应该重载逗号、取地址、逻辑与和逻辑或运算符
应该定义为成员函数:
- 赋值
=
、下标[]
、调用()
和成员访问箭头->
运算符必须是成员- 复合赋值运算符一般应该是成员
- 改变对象状态的运算符或者与给定类型密切相关的运算符,如递增、递减和解引用运算符,通常应该是成员
应该定义为普通的非成员函数
- 具有对称性的运算符可能转换任意一端的运算对象,例如算术、相等性、关系和位运算符等,通常是普通的非成员函数
当把运算符定义成成员函数时,左侧对象必须是运算符所属类的一个对象
string s = "world";
string t = s + "!"; // 正确,string加一个const char*
string u = "hi" + s; // Err,+是string的成员函数