0

重複の可能性:
初期化リストの利点

私はここ数日C++を学んでいますが、2つの形式の長所と短所を判断できない形式が見られます。誰かがここで私を助けてくれることを願っています。

最初のものは変数が初期化されていますvar(value)

class Foo
{
    public:
        Foo(): itsVar1(2), itsVar2(345){}

    private:
        int itsVar1;
        int itsVar2;      
};

2番目は、代入演算子で初期化されますvar = value

class Foo
{
    public:
        Foo()
        {
            itsVar1 = 2;
            itsVar2 = 345;
        }

    private:
        int itsVar1;
        int itsVar2;
}; 

どちらか一方に利点はありますか?それは個人的な好みですか?
最初のスタイル(?)は私にはもっと混乱しているように見えます。メソッドを呼び出してその値を渡しているようです。非常に暗黙的に見えます。一方、2番目の方法は非常に明示的であり、Pythonから来た人は「暗黙的よりも明示的の方が優れている」ので、2番目の方法を好みます。私は何が欠けていますか?

4

3 に答える 3

2

可能な限り常に初期化子リスト (最初のスタイル) を使用してください。そうする主な正当な理由は次のとおりです。

  1. 初期化リストを使用しないと、例外の安全性を保証することが難しくなります。クラス メンバー変数に RAII クラスを初期化子リストと共に使用すると、メンバー変数のコンストラクターによってスローされた例外に直面したときに、コンストラクターがリソースをリークしないことを保証することが簡単になります。

  2. 割り当ては、イニシャライザ リストよりも優れたパフォーマンスを発揮しません。メンバー変数の型が自明でない場合、代入は実際にはパフォーマンスが低下します。初期化子を使用すると、メンバー変数がその場で構築され、デフォルトの構築は行われません。割り当てを使用すると、すべてのメンバー変数が最初に構築されたデフォルトになります。

  3. 初期化子リストは、参照および const メンバー変数に値を割り当てる唯一の方法です。

于 2012-06-06T23:44:07.913 に答える
0

コンストラクタが次のように宣言されている場合

 Foo(): itsVar1(2), itsVar2(345){}

これは、変数 "itsVar1" "および itsVar2" が、そのローカル変数メンバー (つまり、itsVar および itsVar2) の作成時に初期化されることを意味します。この初期化方法は、初期化リストと呼ばれます。ユーザー定義型の場合、そのような初期化はユーザー定義型のコピー コンストラクターを呼び出します。詳細: http://en.wikipedia.org/wiki/Initialization_(programming)#Initializer_list

コンストラクタが次のように定義されている場合

  Foo()
    {
        itsVar1 = 2;
        itsVar2 = 345;
    }

コンストラクターはメモリを作成し、メンバー変数 itsVar1 と itsVar2 を初期化しません。メンバーが作成され、制御がコンストラクターの本体に流れると、値が割り当てられます。

初期化子リストを使用する利点は、メンバー変数が 2 回呼び出されないことです (1 回は作成時に、もう 1 回は値の割り当て時に)。メンバー変数の作成と初期化は同時に行われます。初期化リストに多数の変数がある場合、コンストラクターが呼び出された時点で、他のメソッドよりもパフォーマンスがわずかに向上します。

于 2012-06-06T23:32:57.720 に答える