0

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

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;
}

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

4

3 回答 3

6

但它的真正目的是什么?

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

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

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

a && b

a被修改?不!这是对语言的严重滥用。

于 2012-11-28T21:06:18.490 回答
5

对于内置类型,&&运算符是“逻辑与”,因此当且仅当在布尔上下文中求值时x && y两者x和都为真时,该运算符为真。y

对于内置类型,&&运算符是short-circuited,因此如果第一个参数已经为假,则永远不会评估第二个参数,因此您可以这样说if (p && *p == 10)而不会冒空指针取消引用的风险。对于operator&&用户定义类型的重载,这是不正确的,它只是一个普通函数(因此参数以不确定的顺序计算)。谨防!

于 2012-11-28T21:06:06.460 回答
0

这意味着逻辑运算and符。在代码if (a && b) { ... }中,如果两者都为真,...则将执行。ab

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

于 2012-11-28T21:07:38.117 回答