重載運算子「=」為什麼要回傳reference? |
答題得分者是:GeorgeKu
|
hornacek
一般會員 發表:29 回覆:76 積分:21 註冊:2004-02-02 發送簡訊給我 |
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 發送簡訊給我 |
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 發送簡訊給我 |
引言: 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. 同上。 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |