C++标准规定:
8.1 并不是所有的操作符都能被重载。除了. ,.* ,:: ,? : ,sizeof,typeid这几个运算bai符不能被重载,其他运算符都能被重载
8.2 重载不能改变该运算符用于内置类型时的函义,程序员不能改变运算符+用于两个int型时的含义。
8.3 运算符函数的参数至少有一个必须是类的对象或者类的对象的引用。这种规定可以防止程序员运用运算符改变内置类型的函义。
8.4 重载不能改变运算符的优先级。
8.5 重载不能改变运算符的结合律。
8.6 重载不能改变运算符操作数的个数。比如+需要两个操作数,则重载的+也必须要有两个操作数。
可看到,c++之所以不允许重载?:运算符,是考虑到?:运算符的条件特性。
运算符的重载实质是函数的调用
比如 A?B:C
假设重载函数原型 operator ?: (A,B,C)
那么,其跳转性质就不复存在了。
举例说明:
1
2
3
4
int a=0,b=0;
bool p = true;
p? (a = 10): (b = 10);
//执行结果 a=10 b=0;
转换为函数调用形式
1
2
operator ?:(p,a=10,b=10);
//执行结果 a=10 b=10
显然 函数调用不能解决流程控制的问题,所以为了避免程序理解上的偏差,C++标准规定?:不能重载
——或是没有为什么bai,人家写代码时加个dufinal你就不能重载了。zhi
有可能是人家觉得这个dao运算符他写的代4102码很牛b了,不需1653要你修改了。
还有可能是因为人家不想你去重载,怕破坏了编程规则和C++编程习惯之类。
java中的String类型也是不能重载的。没有为什么。就是人家规定的而已