C++不允许用户自己定义新的运算符,只能对已有的C++运算符进行重载。C++中绝大部分的运算符允许重载,例如:
+ - * / % ^ & | ~ ! = < > += -= *= /= %= ^= &= |= << >> <<= >>= == != <= >= && || ++ -- , ->* -> () []
不能重载的运算符只有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 系统开发