C++运算符重载详解
a. 允许重载的运算符
List item重载运算符需要使用运算符函数,其声明格式为operatorOP(argument-list);
要求OP必须是C++的有效运算符,且不能是./ .* / :: / ?:等;
b. 重载限制
(1)重载后的运算符至少有一个参数为自定义类型;
(2)使用运算符时不能违反运算符原来的句法规则,不能修改运算符的优先级,不能创建新的运算符;
(3)不能重载下面的运算符,sizeof/.成员运算符/ . * 成员指针运算符/::作用域解析运算符/?:条件运算符/typeid一个RTTI运算符/const_cast强制类型转换运算符/dynamic_cast类型转换运算符/reinterpret_cast类型转换运算符/static_cast类型转换运算符等;
(4)大多数运算符可以通过成员函数或非成员函数重载,但=赋值运算符/()函数调用运算符/[]下表运算符/->指针成员运算符只能通过成员函数重载;
成员运算符重载与非成员运算符重载
(1)非成员函数的运算符重载方式不通过成员函数形式调用,要求至少有一个参数为非基本类型;
双目运算符,定义形式为operator X (oprd1,oprd2),使用为oprd1 X oprd2;
前置单目运算符,定义形式为operator X (oprd1),使用为X oprd1;
后置单目运算符,定义形式为operator X(oprd1,0),使用为oprd1 X;
(2)可以使用成员函数形式,也可以使用友元函数形式,基本上等价;成员函数一般默认*this作为左值;友元函数一般默认首先传入的参数作为左值;
成员函数形式与非成员函数形式区别
(1)双目运算符,
成员函数形式,*this隐式传入作为左值,显示传入的参数(有且仅有一个)作为右值;
友元函数形式,显示传入的第一个参数作为左值,第二个作为右值;
(2)单目前缀运算符,X var
成员函数形式,*this隐式传入作为右值,参数列表为空,即不传入参数
友元函数形式,显示传入第一个参数作为右值,有且仅有一个参数
(3)单目后缀运算符,var X
成员函数形式,*this隐式传入作为左值,参数列表为(int),定义仍然为(int),不增加参数名,使用时缺省右值;
友元函数形式,显式传入第一个参数作为左值,第二个参数为int,定义仍然为(int),不增加参数名,使用时缺省右值;
需要注意,只有本身可以作为单目运算符的运算符可以重载为单目运算符;
单目后缀运算符的缺省右值只能使用(int);