什么是运营商&&?

时间:2012-11-28 21:04:26

标签: c++ operator-overloading

它的目的是重载方法中的操作,但它的真正目的是什么?

class CModeType
{
public:
    CModeType(){m_nModeType=1;}
    ~CModeType(){}
    int m_nModeType;
    CModeType&              operator&&( const CModeType& rModeType );
};
CModeType& CModeType::operator &&( const CModeType& rModeType )
{
    this->m_nModeType += rModeType.m_nModeType;
    return *this;
}
int _tmain(int argc, _TCHAR* argv[])
{
    CModeType Mode;
    CModeType Mod2;
    Mode && Mode;
    cout << Mode.m_nModeType << endl; //output:2
    return 0;
}

我也会问||但我相信答案会帮助我理解它。

3 个答案:

答案 0 :(得分:6)

  

但是它的真正目的是什么?

在这种情况下,其目的是使代码的可读性和反直觉性。

在实践中,很少有情况需要重载逻辑AND运算符(这是问题标题的答案)。这不是他们的一部分。

通常,operator &&应标记为const,因为您不期望它,也不应该修改对象。在这种情况下,它不是,它确实如此。从逻辑上讲,你真的期望在你做完之后

a && b

a被修改了吗? 不!严重滥用该语言。

答案 1 :(得分:5)

对于内置类型,&&运算符是“逻辑 - 和”,因此x && y当且仅当xy都为真时才为真在布尔上下文中计算时。

对于内置类型,&&运算符是短路的,因此如果第一个参数已经为假,则永远不会评估第二个参数,因此您可以这样说if (p && *p == 10)没有冒着空指针解除引用的风险。对于用户定义类型的重载operator&&,这不是真的,它只是一个普通函数(因此参数以不确定的顺序计算)。小心!

答案 2 :(得分:0)

这意味着逻辑and - 运营商。在代码if (a && b) { ... }中,如果...a都为真,则会执行b

在您的代码中,您正在重载运算符,因此您在CModeType& operator&&( const CModeType& rModeType )实现中定义了一个全新的目的。它将m_nModeType与thisrModeType(参数)相加,然后返回指向this的指针。对我来说似乎很愚蠢和不合逻辑,我建议不要这样做。