看板 C_and_CPP 關於我們 聯絡資訊
#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
purpose:是,所以 operator char*() 應該要 new char[100] 來回傳 12/11 23:13
Feis:應該不要提供這種轉型 12/11 23:43
可以不要使用暫時物件, 使用具名物件就不會有這問題。 Mystring s3 = s1+s2; const char *p = s3; 之前從來沒注意過暫時物件的生命周期。 這不像表面看來那麼簡單, c++ 標準委員會花了兩年才搞定這問題。 ※ 編輯: descent 來自: 58.114.140.46 (12/12 19:04)
azureblaze:自動轉型很容易發生在暫時物件上 這樣寫很危險 12/12 22:13
azureblaze:至少加個explicit,確保用的人知道他在做什麼 12/12 22:16