运算符重载的定义:
是指重载以运算符为函数名的函数,具有返回值类型,函数名和参数列表。
重载成员运算符函数:
• 形式:return_type class_name::operator op(operand2) {} 这是显示传递1个参数的
•参数数量问题:
•重载二元运算符时,成员运算符函数只需显式传递1个参数(即二元运算符的右操作数),而左操作数则是该类对象本身,通过 this 指针隐式传递。从此A + B 等价于 A.operator + (B)
• 重载一元运算符时,成员运算符函数没有参数,操作数是该类对象本身,通过 this 指针隐式传递 。从此 -A 等价于 A.operator - ()
重载普通运算符函数:
可作为友元函数。
• return_type operator op(operand1, operand2) { } (二元运算符两个参数,一元一个参数)
不可重载的运算符:
基本所有运算符都可重载,除了以下:
① :: (作用域解析)、 . (成员访问)、 .* (通过成员指针的成员访问)
② ?: (三元运算符)、 #: 预处理符号
③ 除 new,delete 外的所有关键字运算符,如 sizeof,alignof,typeid 等等
只能通过成员函数重载的运算符:
大多数运算符都可以通过成员或非成员函数进行重载,但以下只能通过成员函数:
① = 赋值运算符
② ( ) 函数调用运算符
③ [ ] 下标运算符
④ -> 通过指针访问类成员的运算符
运算符重载的其他限制:
• 不能创建新运算符,例如 ** 、<> 或 &|
• 运算符 && 与 || 的重载失去短路求值
• 重载的运算符 -> 必须要么返回空指针,要么返回同样重载了运算符 -> 的 对象。
• 不可能更改运算符的优先级、结合方向或操作数的数量。
重载自增运算符:
① 重载前缀自增运算符,直接重载(以++举例):
return_type class_name::operator ++() {}
② 重载后缀自增运算符,加一个 int 类型的虚拟形参 ,告诉编译器用后缀模式重载: return_type class_name::operator ++(int) {}
• 内建运算符的前置版本返回引用,而后置版本返回值,
• 典型的用户定义重载也遵循该模式;然而,用户定义重载中,其实也能以任何类型为返回类型(包括void)(不推荐)
注意,前置后置自增减函数不能用const,因为改变了自身的值
注意,由于前置传引用,故c=++++++a 等价于 a+=3,c=a;(前置多个加号级联则加多个)
由于后置传值,只能传一个,故c=a++++++ 等价于 c=a,a+=1(后置多个加号级联也只能加1)
重载赋值运算符:
注意支持这样的操作:(c=a).print();
默认有一个缺省的赋值运算符定义,没重载时遇到赋值每个成员变量会直接拷贝值(即浅复制),重载赋值运算符可以改成深复制。
重载移位运算符(重载输入输出流):
使得能够适应对象/结构体类型输入