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

来源:互联网 发布:珠海java编程培训 编辑:程序博客网 时间:2024/05/09 23:43

转载于:http://blog.csdn.net/andylin02/article/details/2774543

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哪一个先计算。完全可能与具有从左参数到右参数计算顺序的短路计算法相反。
    因此如果你重载&&或||,就没有办法提供给程序员他们所期望和使用的行为特性,所以不要重载&&和||。

0 0