SYSU程设c++(第八周)重载成员运算符函数、重载普通运算符函数、不可重载的运算符、只能通过成员函数重载的运算符、运算符重载的其他限制、重载自增运算符、重载赋值运算符、重载移位运算符

运算符重载的定义:

        是指重载以运算符为函数名的函数,具有返回值类型,函数名和参数列表。

重载成员运算符函数:

• 形式: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(); 

默认有一个缺省的赋值运算符定义,没重载时遇到赋值每个成员变量会直接拷贝值(即浅复制),重载赋值运算符可以改成深复制

重载移位运算符(重载输入输出流):

 使得能够适应对象/结构体类型输入

猜你喜欢

转载自blog.csdn.net/jz_terry/article/details/130129683
今日推荐