zoukankan      html  css  js  c++  java
  • 【M7】千万不要重载&&,||和,操作符

    1、C++对于真假值表达式采用“骤死式”评估方法,比如&&,||。

      if( p!=NULL && strlen(p)>10)   如果p为NULL,后面的strlen不会被执行。

      if(index <low || index>upper)   如果index<low,后面的比较不会被执行。

    2、现在假如重载操作符&&,那么从根本上改变了游戏规则。对于expn1 && expn2,编译器首先试图调用expn1.operator&&(expn2),如果不存在,试图调用operator&&(expn1, expn2)。

    3、上面的重载改变了&&原来的语义。原来的&&具备“骤死式”语义,保证从左到右进行评估。而重载后的方法调用,C++不保证调用过程中各参数的评估顺序。因此,不要重载&&,和||。

    4、对于逗号操作符,在for循环的语句中使用,逗号操作符从左到右评估,返回右端的值。重载逗号操作符后,不能保证左侧表达式比右侧表达式先评估,因为C++在调用的时候不保证。

    5、C++中不能重载的操作符有:

      .  .*  ::  ?:

      new  delete  sizeof  typeid

      static_cast  dynamic_cast  const_cast  reinterpret_cast

    6、C++允许重载的操作符有:

      operator new  operator delete  operator new[]  operator delete []

      +  -  *  /  %  ^  &  |  ~

      !  =  <  >  +=  -=  *=  /=  %=

      ^=  &=  |=  <<  >>  >>=  <<=  ==  !=

      <=  >=  &&  ||  ++  --  ,  ->*  -> 

      ()  []

    7、对于允许重载的操作符,必须有个好理由,才去重载。

  • 相关阅读:
    「luogu2414」[NOI2011]阿狸的打字机
    【模板】KMP算法,AC自动机
    「luogu2336」[SCOI2012]喵星球上的点名
    「luogu2463」[SDOI2008]Sandy的卡片
    【模板】后缀数组
    「luogu1972」 [SDOI2009]HH的项链
    北师大部分题解
    D:Sequence Swapping
    Tinkoff Internship Warmup Round 2018 and Codeforces Round #475 (Div. 2)
    点双连通分量F. Simple Cycles Edges
  • 原文地址:https://www.cnblogs.com/nzbbody/p/3567420.html
Copyright © 2011-2022 走看看