作者legnaleurc (CA)
看板C_and_CPP
標題Re: [問題] 請問copy constructor的問題
時間Tue May 10 15:52:58 2011
※ 引述《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