2

コンストラクターパラメーターを渡すための推奨される方法はありますか?特に、これらのコンストラクターパラメーターを使用してメンバー変数を初期化する場合。

簡略化した例。

class Example
{
public:
   Example( /*type-1*/ str, /*type-2*/ v ):
      m_str( str ),
      m_v( v )
   { }

   /* other methods */

private:
   std::string m_str;
   std::complex<float> m_v;
};

オプションは次のとおりです。

  • 値渡し、次にstd::moveオブジェクトをメンバーに渡します。
  • const&、次にパラメータをメンバーにコピーします。
  • &&、次に、パラメーターを使用してメンバーを初期化します。

デフォルト/優先パラメータの受け渡しスタイルはどうあるべきですか?
異なるパラメータタイプで変化しますか?

私の直感では、右辺値参照を使用すると言っていますが、すべての長所と短所を理解しているかどうかはわかりません。

4

1 に答える 1

6

オプション1:

class Example
{
public:
   Example( std::string str, const std::complex<float>& v ):
      m_str( std::move(str) ),
      m_v( v )
   { }

   /* other methods */

private:
   std::string m_str;
   std::complex<float> m_v;
};

これはかなり良いパフォーマンスを持ち、コーディングも簡単です。最適値に少し足りない1つの場所は、左辺値をにバインドするときですstr。この場合、コピー構築と移動構築の両方を実行します。最適なのはコピー構造のみです。ただし、aの移動構造はstd::string非常に高速である必要があることに注意してください。だから私はこれから始めます。

ただし、パフォーマンスのために最後のサイクルをこれから引き出す必要がある場合は、次のことができます。

オプション2:

class Example
{
public:
   Example( const std::string& str, const std::complex<float>& v ):
      m_str( str ),
      m_v( v )
   { }
   Example( std::string&& str, const std::complex<float>& v ):
      m_str( std::move(str) ),
      m_v( v )
   { }

   /* other methods */

private:
   std::string m_str;
   std::complex<float> m_v;
};

このオプションの主な欠点は、コンストラクターロジックをオーバーロード/複製する必要があることです。const&実際、との間でオーバーロードする必要のあるパラメータが1つまたは2つ以上ある場合、この式は非現実的になります&&

于 2011-10-04T16:14:37.420 に答える