2

C++でクラスを初期化する方法は少なくとも2つあります。

(1)初期化子リスト

struct C
{
  int i;
  C() : i(0) {}
};

(2)初期化方法

struct D
{
  int i;
  C() { init(); }
  void init() {
    i = 0;
  }
};

クラスのオブジェクトを時々再初期化する必要があります。2番目の解決策では、単純にを呼び出すことができますobj.init()init()最初の解決策では、初期化子リストの効果を本質的に複製する関数を追加するか、を使用する必要がありますobj = C()

ここでどのバリアントが優れているかについて、多かれ少なかれコンセンサスがありますか?初期化メソッドを使用することには不利な点がありますか( C ++ FAQに記載されているパフォーマンスの低下の可能性を除く)。

4

3 に答える 3

6

主な違いは、初期化リストを使用せずにメンバーが作成され、それらに値が割り当てられることです。初期化リストを使用する場合、メンバーは指定された値を使用して直接作成されます。

初期化を使用することが重要な場合の1つの状況は、クラスがメンバーとしていくつかの参照を保持し、それらが構築されているときにこれらのメンバーを正しく初期化する必要がある場合です。

class A
{
public:
    A(B& bRef) : bRef_(bRef) { }
private:
    B& bRef_;   
}

この質問も役に立ちます。この特定のケースでは、メンバー初期化子リストの使用とコンストラクターでの値の割り当てに違いがありますか?

あなたのinit()方法は完全にうまくいきます。あなた自身が述べたように、このクラスのインスタンスが構築されているときだけでなく、これらのメンバーを何度も初期化したいので、再利用性と単純さのために、メソッドに保持するのが正しいです。本当に必要な場合を除いて、コードのパフォーマンスを向上させようとしないでください。

速いプログラムを正しくするよりも正しいプログラムを速くする方が簡単だと言う人もいます。;)

于 2013-02-04T14:55:29.183 に答える
5

配列を作成するとき(ベクトルを使用するか、を使用して動的に割り当てるnew)、コンストラクターを使用しているときにそのメンバーのそれぞれを明示的に呼び出す必要がありますinit。これは、すべての要素に対して自動的に呼び出されます。

基本的な初期化をコンストラクターに配置し、より複雑なロジックをinitメソッドに配置することを好みます。私の意見では、コンストラクターは複雑な操作を実行するべきではありません。

于 2013-02-04T14:51:52.057 に答える
0

以下は、初期化子リストを使用する場合のシナリオです。

  • 非静的constデータメンバーの初期化用。
  • 参照メンバーの初期化用。
  • デフォルトのコンストラクターを持たないメンバーオブジェクトの初期化用。
  • 基本クラスのメンバーの初期化用。
  • コンストラクターのパラメーター名がデータメンバーと同じ場合。
  • パフォーマンス上の理由から。
于 2016-09-28T12:21:57.253 に答える