C++重载运算符的规则

Posted Linux编程学堂

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++重载运算符的规则相关的知识,希望对你有一定的参考价值。

重载运算符的规则

C++不允许用户自己定义新的运算符,只能对已有的C++运算符进行重载。C++中绝大部分的运算符允许重载,例如:

+  -  *  /  %  ^  &  |  ~  !  =  <  >  +=  -=  *=  /=  %=  ^=  &=  |=  <<  >>  <<=  >>=  ==  !=  <=  >=  &&  ||  ++  --  ,  ->*  ->  ()  []

不能重载的运算符只有5个:

  1. . --- (成员访问运算符)
  2. .* --- (成员指针访问运算符)
  3. :: --- (域运算符)
  4. sizeof --- (长度运算符)
  5. ?: --- (条件运算符)

前两个运算符不能被重载是为了保证访问成员的功能不能被改变,域运算符和sizeof运算符的运算对象是类型,而不是变量或一般表达式,不具备重载的特征。

重载不能改变运算符运算对象(即操作数)的个数。如关系运算符“>”和“<”等是双目运算符,重载后仍为双目运算符,需要两个参数。运算符“+”,“-”,“*”,“&”等既可以作为单目运算符,也可以作为双目运算符,可以分别将它们重载为单目运算符或双目运算符。

重载不能改变运算符的优先级别。例如“*”和“/”优先于“+”和“-”,不论怎么样进行重载,各运算符之间的优先级别不会改变。有时在程序中希望改变某些运算符的优先级,也只能使用圆括号的办法强制改变重载运算符的运算顺序。

重载不能改变运算符的结合性。如赋值运算符“=”是右结合性(自右至左),重载后仍为右结合性。

重载运算符的函数不能有默认的参数。否则,就改变了运算符参数的个数,与前面第三点矛盾。

重载的运算符必须和用户定义的自定义类型的对象一起使用,其参数至少应有一个是类对象(或类对象的引用)。也就是说,参数不能全部是C++的标准类型,以防止用户修改用于标准类型数据的运算符的性质,如下面这样是不对的:

int operator +(int a, int b)

return (a - b);

原来C/C++提供运算符 + 的作用是对两个数相加,那么,上面对运算符+进行重载,企图通过重载使它的作用改为两个数相减。如果允许这样重载的话,如果有表达式 4 + 3,它的结果是执行 (4 - 3) = 1的结果,那么,与常规的加法算术运算不同,这是不允许的。

所以,重载运算符,操作的参数类型,不能够完全都是C/C++语法已经定义的数据类型,否则,就是修改了C/C++语法定义的运算符操作规则。

用于类对象的运算符一般必须重载,但是,有两个例外,运算符“=”和“&”不必用户重载,但是,可以重载。

(1)赋值运算符“=”可以用于每一个类对象,可以利用它在同类对象之间相互赋值。可以用赋值运算符“=”对类的对象赋值,这是因为系统已为每一个新声明的类重载了一个赋值运算符,它的作用是逐个复制类的成员变量。由于可以认为它是系统提供的默认的对象赋值运算符,可以直接用于对象间的赋值,不必自己进行重载,但是,有时系统提供的默认的对象赋值运算符不能满足程序的要求,例如,成员变量中包含指向动态分配内存的指针成员时,在复制此成员时就可能出现危险。在这种情况下,就需要自己重载赋值运算符。

(2)地址运算符“&”也不必重载,它能返回类对象在内存中的起始地址。

从理论上来说,可以将一个运算符重载为执行任意的操作,只要我们在重载的运算符函数中自己写代码操作就可以了。


韦凯峰 Linux C/C++ 程序设计教程,Linux 系统编程,Openwrt 系统开发

以上是关于C++重载运算符的规则的主要内容,如果未能解决你的问题,请参考以下文章

关于双目运算符的重载问题

运算符重载

Part8 多态性 8.1运算符重载

C++重载单目运算符

C++重载单目运算符

C++运算符重载函数作为友元函数