看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《descent (「雄辯是銀,沉默是金」)》之銘言:
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