→ Feis:應該不要提供這種轉型 12/11 23:43
: 可以不要使用暫時物件, 使用具名物件就不會有這問題。
: Mystring s3 = s1+s2;
: const char *p = s3;
即使如此, 還是不應該提供這種隱性轉型的方式.
你得到的設計缺點比這一點點使用上的好處多太多了.
直覺的問題當然是暫時物件出現的機率可能很高.
雖然很多情況下暫時物件的出現並不會造成問題.
但還有其他的風險.
舉個例子:
const char *Func1() {
MyString a;
return a;
}
const char *Func2() {
char str[100];
return str;
}
MyString *Func3() {
MyString a;
return &a;
}
在 g++ 裡面, Func2 跟 Func3 是會出現 warning (-Wreturn-local-addr)
但是使用隱性轉型的 Func1 卻不會.
這意味著這樣的設計隱藏很多不小心使用的風險.
例如 std::string 就沒有設計這樣的轉型而是提供了一個 c_str() 的成員函式.
雖然一樣會有上面的問題, 但是程式碼語意會比較清楚.
追根究柢一般物件的轉型基本原則還是要遵守建構語意.
回傳一個指涉內部資源的方法正常情況是不可為的.
(除非提供額外的資源管理機制, 將內部資源變成共享. 只是這裡是裸指標, 大概無好的解法)
雖然版友提到使用 c++11 的 explicit conversion operator 把責任交給使用者是相對較好的方法
但是鑒於上面提到的基本原則, 我認為提供成員函式還是會比較好. (當然最好是都不要)
畢竟正常的程式碼裡面應該要避免顯性轉型的使用
此外你的 operator+ 回傳的 MyString 應該要是 const MyString
這應該是運算子多載的基本法則.
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.112.29.148
※ 編輯: Feis 來自: 140.112.29.148 (12/13 12:00)
推 CaptainH: 12/13 14:44
推 descent:請教回傳值有無 const 會造成什麼問題 12/13 16:22
→ Feis:s1 + s2 = s3; 這樣語法會正確. 但語意很奇怪. 12/13 16:58
推 descent:感謝說明 12/13 20:22
推 littleshan:其實到了 C++11 後要回傳 non-const object 12/14 14:09
→ littleshan:否則會無法利用到 move semantics 12/14 14:09
→ Feis:是, 但要幫 operator= 加 & 避免這問題 12/14 14:34