您的位置:首页 > 编程语言 > C语言/C++

More Effective C++ 阅读笔记(六)--哪些运算符不能重载

2008-08-06 09:33 513 查看
More Effective C++ 阅读笔记(六)--哪些运算符不能重载
黑月亮 发表于 2005-10-3 16:22:00

下面这些操作符不能重载
"&&" ,"||" , "," , "." , ".*" , "::" , "?:"
new delete sizeof typeid
static_cast dynamic_cast const_cast reinterpret_cast
下列操作符你可以重载
operator new operator delete
operator new[] operator delete[]
+ - * / % ^ & | ~
! = < > += -= *= /= %=
^= &= |= << >> >>= <<= == !=
<= >= && || ++ -- , ->* ->
() []

原因
例如:
if (expression1 && expression2) ...
对于编译器来说,等同于下面代码之一:
if (expression1.operator&&(expression2)) ... // when operator&& is a member function
if (operator&&(expression1, expression2)) ... // when operator&& is a global function
这好像没有什么不同,但是函数调用法与短路求值法是绝对不同的。首先当函数被调用时,需要运算其所有参数,所以调用函数functions operator&& 和 operator||时,两个参数都需要计算,换言之,没有采用短路计算法。第二是C++语言规范没有定义函数参数的计算顺序,所以没有办法知道表达式1与表达式2哪一个先计算。完全可能与具有从左参数到右参数计算顺序的短路计算法相反。
因此如果你重载&&或||,就没有办法提供给程序员他们所期望和使用的行为特性,所以不要重载&&和||。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: