[討論] 暫時物件的生命周期

看板C_and_CPP (C/C++)作者 (「雄辯是銀,沉默是金」)時間12年前 (2013/12/11 22:40), 編輯推噓1(103)
留言4則, 3人參與, 最新討論串1/3 (看更多)
#include <string> #include <cstdio> using namespace std; class Mystring { public: friend Mystring operator+(const Mystring&, const Mystring&); Mystring(const char *s) { sprintf(str_, "%s", s); } ~Mystring() { printf("~Mystring: %s\n", str_); str_[0]='1'; str_[1]=0x0; } operator const char*() { return str_; } private: char str_[100]; }; Mystring operator+(const Mystring &s1, const Mystring &s2) { char str[100]; sprintf(str,"%s%s", s1.str_, s2.str_); return Mystring(str); } int main(int argc, char *argv[]) { Mystring s1("123"), s2("abc"); const char *p = s1+s2; printf("p: %s\n", p); return 0; } s1+s2 產生的暫時物件在 const char *p = s1+s2; 就會解構了, 所以 printf("%s\n", p); 不會有預期的結果 (123abc) 是這樣解釋的嗎? 執行結果: descent@debian-vm:tmp$ ./a.out ~Mystring: 123abc p: 1 ~Mystring: abc ~Mystring: 123 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 58.114.140.230

12/11 23:13, , 1F
是,所以 operator char*() 應該要 new char[100] 來回傳
12/11 23:13, 1F

12/11 23:43, , 2F
應該不要提供這種轉型
12/11 23:43, 2F
可以不要使用暫時物件, 使用具名物件就不會有這問題。 Mystring s3 = s1+s2; const char *p = s3; 之前從來沒注意過暫時物件的生命周期。 這不像表面看來那麼簡單, c++ 標準委員會花了兩年才搞定這問題。 ※ 編輯: descent 來自: 58.114.140.46 (12/12 19:04)

12/12 22:13, , 3F
自動轉型很容易發生在暫時物件上 這樣寫很危險
12/12 22:13, 3F

12/12 22:16, , 4F
至少加個explicit,確保用的人知道他在做什麼
12/12 22:16, 4F
文章代碼(AID): #1Ig7bAak (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1Ig7bAak (C_and_CPP)