下面是String類的多載,有個疑問 什么時候回傳String 什么時候回傳 String& ?
String operator+(const String &str) const; //多載+
String& operator=(const String &str); //多載=
String& operator+=(const String &str); //多載+=
uj5u.com熱心網友回復:
回傳什么看你自己要實作什么邏輯,但常規來說,以常見的int為例:
//加法運算operator+
int a = 1, b = 2, c;
c = a + b; //a看作operator=的呼叫者,b是const引數肯定不變,c是回傳值。執行此句,你希望a的值被改變嗎?如果回傳參考,那就可以有(a+b) = 4這種不符合常規思維的騷操作。引入左右值的概念,你希望a+b這個運算式回傳值是左值還是右值?那你可以嘗試一下取地址&(a+b)能不能編譯過。
int a;
a = 1; //此句也是一個賦值運算式,它有回傳值,回傳值就是變數a本身,是個左值,可以取地址,也就是可以再把它賦給其它變數。
int b = a = 1; // 相當于int b = (a = 1),先是給a賦值為1,再把a的值賦給b,然后a和b都是1.
(a = 1) = 2; // 這樣語法也可以,但也是奇葩, 先把1賦給a,回傳的是變數a本身,再把2賦值給a。
到底回傳什么,一般只是為了迎合常規的語法思維而已。你可以有奇葩的實作,自己負責。
多的不說了,到底是回傳參考還是非參考,自己動手多寫代碼去研究學習,可以把你的各種想法都用代碼編出來,去驗證你的結果,就知道了。
uj5u.com熱心網友回復:
樓上講的很好,為什么要用&,你一定用過cin吧,使用cin連續輸入一系列變數比如
cin>>a>>b>>c;
這行代碼就是利用了&,cin>>a回傳cin的一個參考,然后繼續使用cin>>b
uj5u.com熱心網友回復:
老師講的好,有所識訓
uj5u.com熱心網友回復:
錯誤百出
uj5u.com熱心網友回復:
跟自己實作什么什么邏輯關系不大,不過是語意的正確性與效率相關uj5u.com熱心網友回復:
如果你不包含指向對記憶體的欄位的類,你具體回傳string or string& ,幾乎沒有什么區別uj5u.com熱心網友回復:
string 是將函式內的值又拷貝了一份出去吧
string& 是將參考直接回傳,不存在拷貝
我理解的對嗎
uj5u.com熱心網友回復:
“
//加法運算operator+
int a = 1, b = 2, c;
c = a + b; //a看作operator=的呼叫者,b是const引數肯定不變,c是回傳值。執行此句,你希望a的值被改變嗎?如果回傳參考,那就可以有(a+b) = 4這種不符合常規思維的騷操作。引入左右值的概念,你希望a+b這個運算式回傳值是左值還是右值?那你可以嘗試一下取地址&(a+b)能不能編譯過。
”
他的這一段我不太理解,“如果回傳參考,那就可以有(a+b) = 4這種不符合常規思維的騷操作。” 這一句的原因是什么?
uj5u.com熱心網友回復:
我對這一句不太理解:“如果回傳參考,那就可以有(a+b) = 4這種不符合常規思維的騷操作。” 為什么 回傳參考(a+b) = 4 ?
uj5u.com熱心網友回復:
我說的那些,就是語意問題。
operator+ 就是要回傳非參考,右值,語意問題;
operator=就是要回傳參考,效率問題,如樓上某人說的。
String operator+(const String& s){
return *this;
}
String& operator=(const String& s){
return *this;
}
語法上沒問題的代碼,語意混亂。
//如果回傳參考型別,,那回傳誰的參考??只能是*this了。那就可以寫d=(a+b)=c這種代碼。
String& operator+(const String& s){
return *this;
}
//回傳非參考,就會多呼叫一次拷貝構造String(const String& s),效率低
String operator=(const String& s){
return *this;
}
//沒有回傳值也行,那就不能寫a=b=c這樣連等賦值的代碼。
void operator=(const String& s){
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/101715.html
標籤:C++ 語言
上一篇:關于printf函式
