2012-11-28 112 views
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; 
} 

我也會問關於||但我相信答案會幫助我理解它。

+5

這是一個非常糟糕的原因來重載'operator &&'。請注意,過載會導致短路不再發生。 – chris

+1

大聲笑,乍一看,我認爲'模式&& Mode;'是一個右參考:) – fredoverflow

+0

您是否在尋找按位&? –

回答

5

對於內置類型,該&&運營商是「邏輯和」,所以,在一個布爾上下文中,如果和評估時,只有當兩個xy是真正的x && y是真實的。

對於內置類型,該&&運營商短路,使第二個參數是從來沒有評估,如果第一個已經是假的,所以你可以說這樣的話if (p && *p == 10),而不用擔心一個空指針引用。對於用戶定義類型的重載operator&&,這不是真的,它只是一個普通的函數(因此參數以不確定的順序進行評估)。謹防!

+0

我覺得這不可能是他問的問題,因爲他是一位經驗豐富的程序員。我們必須誤解這個問題...... – Aerovistae

+0

@Aerovistae:好吧,也許吧,但問題確實是「操作符是什麼&&」,所以如果OP在別的之後,他應該更清楚一點。 –

+0

Kerrek,你可以展示一個小實際的例子嗎?我明白了,但我無法想象它將如何被邏輯使用。 –

6

但是這會是真正的目的嗎?

在這種情況下,它的目的是使代碼不易讀和違反直覺。

實際上,很少有情況下您想要超載邏輯AND運算符(這是問題標題的答案)。這不是他們的一部分。

通常,operator &&應該標記爲const,因爲您不期望它,也不應該修改對象。在這種情況下,它不是,它確實如此。在邏輯上,你真的期望在你做後

a && b 

a得到修改? 不!這是對語言的粗暴濫用。

+2

如果downvote是因爲我最初寫「它是」而不是「它的」,我完全配得上它。 –

+2

那麼'std :: cout << x'怎麼樣,不應該改變'std :: cout',對吧? ;) – fredoverflow

+0

我認爲OP正在尋找按位操作。 &&實現中的int + int。同樣粗暴地使用該語言會使用for(; cond;)作爲if(cond)這是一種糟糕的形式。 –

0

這意味着邏輯and -operator。在代碼if (a && b) { ... }中,如果ab均爲真,則將執行...

在你的代碼中,你超載了運算符,所以你給它一個全新的目的在CModeType& operator&&(const CModeType& rModeType)實現中定義。它將總結m_nModeType爲thisrModeType(參數),然後返回指向this的指針。對我來說,這似乎很愚蠢和不合邏輯,我會建議不要這樣做。