7

私が出会ういくつかのクラスには、二重の文字列コンストラクターがあります。

 construct( const std::string& s );
 construct( const char* s );

コンストラクターを持つことには、なしstd::stringで a を渡すことができるという明らかな利点があります。ただし、とにかく引数が std::string に格納されている場合、コンストラクターを持つ利点はありますか?std::stringc_str()const char*

特に:

 construct( const std::string& s ) : m_string( s ) {}
 construct( const char* s ) : m_string( s ) {}
 std::string m_string;

2 番目のコンストラクターは、文字列リテラルとchar*変数に対して高速になりますか、それとも最適化されますか?

追加の質問 - C++11 は構造を変更しますか?

4

2 に答える 2

5

char*最初のコンストラクターしかない場合は、コピーが 2 回行われる可能性があります。in std::string(char*)そしてconstruct(std::string)

2番目のコンストラクターでは、ポインターがコピーされ(高速です)、文字列がコピーされます。

C++11 では、1 つのコンストラクターを作成することをお勧めします。

 construct(std::string s ) : m_string( std::move(s) ) {}

この場合、char*データだけが文字列 ctor にコピーされる可能性がありますが、文字列は一時的なものになるため、単にconstructctorに移動されます

このコードは「作成、コピー」を出力します
このコードは「作成、移動」を出力し ます

于 2013-07-30T00:44:10.417 に答える