2016-07-20 2 views
2

私のテキストブックの1つを読んで、コンストラクタの初期化子を見つけました。パフォーマンスの違いがあるかどうか、C++の一般的なコーディング標準には好ましい方法であるかどうかを知りたいと思います。C++のコンストラクタ:初期化子の使用と定義の値の設定の比較

仮定します

  • をデフォルトコンストラクタは、任意のパラメータを取りません(そう何validtionは必要ありません)
  • クラスは、2つのプライベート変数を持っていること:int型aとint型B
  • 両方の変数がする必要があります

    //Setting each private variable with assignment statements 
    SampleClass::SampleClass() 
    { 
        a = 0; 
        b = 0; 
    } 
    
    //Using initializers to set the private variables 
    SampleClass::SampleClass() : a(0), b(0) 
    { 
    } 
    
    :例

0に設定します



私はパラメータを持っており、パラメータは検証のいくつかの並べ替えを必要とするコンストラクタがある場合、それは内部に検証メソッドを使用するのが最善だと想像します。あなたがそれらを混ぜると言われていますか?

例:変数、パフォーマンスに優れている設定の二つの方法の

  1. SampleClass2::SampleClass2(int fNumber, int sNumber) : a(fNumber) 
    { 
        makeSureNotZero(sNumber); 
    } 
    



    ちょうど質問を明確にするには?

  2. C++の一般的なコーディング標準では一般的に1つの方法が好まれますか?
  3. 両方の方法を混在させることはできますか?
+0

私はなぜあなたがダウン投票をするのか教えてください。私はルールとパフォーマンスを求めているので、これは意見に基づいていない質問であると感じています。 – kingcobra1986

+1

もし私が間違っていないなら、主な違いは初期化が起こる時です。初期化リストを使用すると、クラスメンバーはクラス宣言の順序に従って初期化され、次にconstrictorが実行されます。 2番目のケースでは、すべてがコンストラクタメソッド内で初期化されます。 – Logman

答えて

3

両方の方法を混在させる法律はありません。

PODsの場合、いずれの方法でも測定可能な差はなく、C++コンパイラは両方の初期化メソッドに対して同じコードを生成する可能性があります。

一方、クラスメンバがPODのような複雑なクラスの場合、intのように、コンストラクタの初期化によってより良い結果が得られます。これは経験則であり、実際の結果はそれぞれのクラスによって異なります。クラスのインスタンスを構築し、その代入演算子を呼び出すと、直接構築するよりも良い結果が得られるということは、デフォルトが完全には信じられません。

+0

推奨される一般的なC++コーディング標準については? – kingcobra1986

+3

C++のコーディング標準に関する魅力的なことは、誰もが独自のコーディング標準を持っていることです。それは他のすべてよりも優れています。 –

+0

@サム:しかし、私は本当に**優れています**。

1

私の答えは、コンパイラによって異なります。ほとんどのコンパイラは、それらの両方を最適化するのに十分なほどスマートで、同等のものにする必要があります。もしコンパイラが単に見ている要因ではなかったと思ったら、私はイニシャライザリストを想定します。初期化してから設定する代わりに、メンバー変数を初期化します。それはほんの数命令ではありませんが、私はコンパイラにそれを処理させるでしょう。

関連する問題