看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《chchwy (mat)》之銘言: : 標題: [問題] 請問copy constructor的問題 : 時間: Tue May 10 00:12:04 2011 : class Foo { : public: : Foo(); // 1 : Foo( const Foo & rh ); // 2 : Foo& operator=( cosnt Foo & rh ); // 3 : }; : : Foo do_something ( ) { : Foo f1; // 4 : return f1; // 5 : } : : Foo f3 = do_something( ); // 6 : → angleevil:我想請問一下第40行,為何copy constructor會觸發第二次 05/10 15:09 : → james732:第一次是把f1複製到臨時物件,第二次把臨時物件複製到f3 05/10 15:13 : → james732:(應該是吧...XD) 05/10 15:13 因為 6 的意義不是 assignment 而是 implicitly copy construct 如果 2 那行這麼寫 explicit Foo( const Foo & rh ); 那 6 會編譯錯誤 必須使用 explicitly copy construct Foo f3( do_something() ); 當然不會有人真的把 copy constructor 宣告為 explicit 但 explicit 的確很重要, 因為它同時阻止了所有的隱式轉型 比方說 std::string 有個 constructor string( const char * cString ); 這讓我們可以直接傳 const char * 給接受 std::string 的函式, 像是 void foo( const std::string & s ); // foo( "C String" ); 但 std::vector 的某個只接受一個 std::size_t 的 constructor 就使用 explicit 阻止那些 int 被意外的轉型為 std::vector void foo( const std::vector< int > & v ); // foo( 1 ); // wrong! // foo( std::vector( 1 ) ); // at least you know what happens 使用者必須在函式呼叫時明確地使用 std::vector( 1 ) -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 111.248.106.184
uranusjr:推 05/10 16:24
angleevil:恩,以前有看過more effective c++提到這個,沒想到這邊 05/10 16:49
angleevil:會發生同樣問題 05/10 16:49