問題:
MSDN文檔中解釋到:operator=操作符缺省情況下返回引用——
TYPE& TYPE::operator=(const TYPE&)
為什麼呢?我對此的理解是:“=”是個二進制操作符。其傳入的參數是引用對象,而其它的參數是類實例,“=”在這個類實例中被重載。而我在實際應用中可以不用返回任何類型(void)來實現賦值操作符,並仍然可以完成賦值操作。我這樣做正確嗎?如果不正確,那麼為什麼缺省的實現返回引用呢?
解答:
如果你再花點時間想一想可能就會有答案。其實很簡單。operator=返回引用的理由是使你能在一個語句中連接多個賦值。
TYPE a,b,c,d;
…
a = b = c = d;
編譯器是象這樣解釋前面一行的:
a = (b = (c = d));
在編譯過程中,賦值是右結合的。說白了就是如果你想要玩一下多個賦值,operator=返回的東西必須是右(rhs)賦值。除了返回對對象自身的引用還能有什麼呢?這就是為什麼operator=最後一行總是返回對this的引用:
CMyClass& CMyClass::operator=(const CMyClass& rhs) {
......
// do the
// assignment
return *this;
};
rhs參數被聲明為常量的話,就允許常量對象的賦值。沒有理由不允許。為什麼operator=要返回非常量引用呢?所以不管在哪裡你都能使用賦值語句對TYPE進行引用:
void MyFunc(TYPE& a);
...
TYPE a,b;
MyFunc(a=b); // 賦值以後傳遞
由於operator=返回非常量,你甚至可以使用圓括弧重載通常的等號結合率:
TYPE a,b,c;
(a = b) = c;
圖一是簡單的示例。並有一個問答題:當你完成並運行FOO時,它的輸出是什麼?
如果你想要學習更多的關於賦值操作的內容,我強烈推薦一本書《Effective C++》作者是Scott Meyers。本書由Addison Wesley Longman, 1997出版。