特にコンストラクターでは、次の構造がよく見られます。
class::class(const string &filename)
{
}
class::class(const char * const filename)
{
}
ステップバイステップのデバッグにより、ハードコードされた文字列を渡すと、常に2番目のコンストラクターが呼び出されることがわかりました。
何か案が:
1)なぜ二重構造が使用されるのですか?
2)速度差はどれくらいですか?
ありがとう。
特にコンストラクターでは、次の構造がよく見られます。
class::class(const string &filename)
{
}
class::class(const char * const filename)
{
}
ステップバイステップのデバッグにより、ハードコードされた文字列を渡すと、常に2番目のコンストラクターが呼び出されることがわかりました。
何か案が:
1)なぜ二重構造が使用されるのですか?
2)速度差はどれくらいですか?
ありがとう。
NULL
にを渡すことができるため、2つのコンストラクタが必要ですMyClass::MyClass(const std::string &arg)
。2番目のコンストラクターを提供することで、ばかげたクラッシュからあなたを救います。
たとえば、クラスのコンストラクターを作成し、をconst std::string &
使用する場合に有効であるためにポインターをチェックする必要がないように、それを取得しますconst char*
。そして、あなたのコードのどこでもあなたはただstd::string
sを使っています。ある時点で、あなた(または別のプログラマー)はそこにを渡しますconst char*
。ここに良い部分がありstd::string
ます-それはコンストラクタを持っています、そしてそれは取るchar*
、そしてそれは問題なくコンパイルするという事実を除けば非常に良いですstd::string a_string(NULL)
、ただ動作しません。
ここで、あなたが示したような2番目のコンストラクターが便利です。
MyClass::MyClass(const char* arg)
: m_string(arg ? arg : "")
{}
std::string
を渡すと、有効なオブジェクトになりますNULL
。
この場合、速度について心配する必要はないと思います。あなたは測定を試みることができますが、私はあなたが(もしあれば)わずかな違いがあることに驚くだろうと思います。
編集:試してみstd::string a_string(NULL);
ました、うまくコンパイルします、そしてそれが私のマシン(OS X + gcc 4.2.1)で実行されたときに何が起こるかです(私はしばらく前にWindowsでそれを試したことを思い出します、結果はまったく同じではないにしても非常に似ていました)::
std::logic_error: basic_string::_S_construct NULL not valid
これは、実装がそれ自体でsを処理する場合に役立ちますconst char*
が、ほとんどの場合、ユーザーによって呼び出されstd::string
ます。これらはstd::string
APIを使用して呼び出すことができます。これは通常、実装を呼び出しc_str()
てディスパッチするだけです。const char*
一方、呼び出し元がすでにc文字列を持っている場合は、一時的または不要な文字列をstd::string
作成する必要はありません(これはコストがかかる可能性があり、長い文字列の場合はヒープ割り当てになります)。
また、私はかつて次のケースを解決するためにそれを使用しました:
私のインターフェースはstd::string
'sを取りましたが、外部モジュールに実装する必要がありました。したがって、モジュールと呼び出し元モジュールの両方のSTLバイナリバージョンが正確に一致する必要がありました。そうでないと、クラッシュしていました(ポータブルライブラリにはあまり適していません…)。そこで、実際のインターフェースを使用するように変更し、宣言したオーバーロードをconst char*
追加したので、エクスポートされませんでした。既存のコードを壊すことはありませんでしたが、モジュール境界の問題はすべて解決しました。std::string
inline
1)なぜ二重構造が使用されるのですか?
std::stringからconstcharconstへの暗黙の変換がないため、std :: stringオブジェクトをparametersmとして便利に使用する場合は、文字列参照バージョンが必要です。const char * constバージョンは、文字配列を暗黙的にstd :: stringに変換できるためオプションですが、一時的なstd :: stringを作成する必要がないため、より効率的です。
2) What is the speed difference?
あなたはそれを自分で測定する必要があります。
それらは基本的に便利のために提供されます。C関数を呼び出すと、char*ポインターを取得する場合があります。その他、文字列を取得するため、両方のコンストラクターを提供することは、呼び出し元にとって便利です。速度に関しては、どちらもコンストラクタにメモリアドレスを送信するため、どちらも実質的に同じ速度です。