全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1343
推到 Plurk!
推到 Facebook!

重載運算子「=」為什麼要回傳reference?

答題得分者是:GeorgeKu
hornacek
一般會員


發表:29
回覆:76
積分:21
註冊:2004-02-02

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-05-14 14:22:04 IP:218.160.xxx.xxx 未訂閱
class TestClass
{
public:
    TestClass& operator=(const TestClass& Another); // 重載運算子需要宣告嗎?        // define something...
}    TestClass& TestClass::operator=(const TestClass& Another)
{
    // do something...        return *this;
}
上面這一段程式碼主要是為了要重載TestClass的運算子「=」。 第一個問題是重載運算子需要在定義物件的地方宣告嗎? 第二個問題是operator=的參數為什麼要傳入reference而不用一般物件就可以?也就是如下宣告:
TestClass& operator=(const TestClass Another);
最後一個問題是operator=的回傳為什麼也是用reference而不是一般物件?也就是如下宣告:
TestClass operator=(const TestClass& Another);
不知道return by reference有什麼好處?有沒有大大可以幫我解惑?感激...
GeorgeKu
中階會員


發表:1
回覆:120
積分:74
註冊:2004-10-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-05-14 15:27:49 IP:61.228.xxx.xxx 未訂閱
1.它只需在類別中定義,如同你的Sample code一樣. 2.一般來說物件的傳遞都是用指標或是參考,如果使用一般物件的話會有幾個因素必須要考慮到的 當你傳物件時以及回傳物件時,COPY CONSTRUCTOR都會被呼叫一次,一般來說物件所佔的記憶體空間比像int,char,...etc大上許多,所以進出都要拷貝大量的資料,效率上當然就沒有指標或參考來的好(只需拷貝4個BYTE而已). 另外一個問題就是如果你的類別裡面有指標成員的話,而且你沒有在COPY CONSTRUCTOR中作處理的話,會有指標指向相同記憶體的情況.當然狀況會有很多看你如何避開,你可以參考ANPINO版主的這篇文章http://delphi.ktop.com.tw/topic.php?TOPIC_ID=48266 3.最後一個問題也是牽扯到上面的情況.
hornacek
一般會員


發表:29
回覆:76
積分:21
註冊:2004-02-02

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-05-14 21:38:38 IP:218.160.xxx.xxx 未訂閱
引言: 1.它只需在類別中定義,如同你的Sample code一樣. 2.一般來說物件的傳遞都是用指標或是參考,如果使用一般物件的話會有幾個因素必須要考慮到的 當你傳物件時以及回傳物件時,COPY CONSTRUCTOR都會被呼叫一次,一般來說物件所佔的記憶體空間比像int,char,...etc大上許多,所以進出都要拷貝大量的資料,效率上當然就沒有指標或參考來的好(只需拷貝4個BYTE而已). 另外一個問題就是如果你的類別裡面有指標成員的話,而且你沒有在COPY CONSTRUCTOR中作處理的話,會有指標指向相同記憶體的情況.當然狀況會有很多看你如何避開,你可以參考ANPINO版主的這篇文章http://delphi.ktop.com.tw/topic.php?TOPIC_ID=48266 3.最後一個問題也是牽扯到上面的情況.
感謝GeorgeKu大大的詳細解說,我來綜合一下結論... 1. 也就是說重載運算子也必須要定義。 2. 除了可以節省記憶體外,也可以避開一些指標上的問題,但其實不用reference也是可以,只是可能會比較麻煩。 3. 同上。
系統時間:2024-11-22 7:45:11
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!