Re: [討論] 暫時物件的生命周期
※ 引述《descent (「雄辯是銀,沉默是金」)》之銘言:
→
12/11 23:43,
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)
推
12/13 14:44, , 1F
12/13 14:44, 1F
推
12/13 16:22, , 2F
12/13 16:22, 2F
→
12/13 16:58, , 3F
12/13 16:58, 3F
推
12/13 20:22, , 4F
12/13 20:22, 4F
推
12/14 14:09, , 5F
12/14 14:09, 5F
→
12/14 14:09, , 6F
12/14 14:09, 6F
→
12/14 14:34, , 7F
12/14 14:34, 7F
討論串 (同標題文章)
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章