0
#include <iostream>
using namespace std;
class Ex {
private:
    int i;
    float f;
public:
    Ex(int i,float f):i(i),f(f) {
        cout << this->i << '\t' << this->f << endl;
    }
    ~Ex(){
        cout << "destructor";
    }
};
int main() {
    Ex i(10,20.1f);
}

上記のプログラムで、コンストラクターが次のようなパラメーター化されたコンストラクターである場合:

Ex(int i,float f){
        i=i;
        f=f;
        cout << this->i << '\t' << this->f << endl;
    }

ここでは、同じ名前のローカル変数のためにデータ メンバーが隠されているため、オブジェクトのデータ メンバーはジャンクに初期化されます。しかし、上記のプログラムでは、明示的な this.How がなくても問題なく動作します。

4

3 に答える 3

2

herehereなど、以前にも同様の質問がありましたが、多くの回答はこれが (Konstantin D - Infragistics の発言に反して) コンパイラ固有のものではないことを指摘していますが、実際に関連する部分を引用する回答は見つかりませんでした。標準。

それで、ここにあります。重要なステートメントを強調するために強調を加えました。

(§12.6.2/10)非委任コンストラクターでは、初期化は次の順序で進行します。

— 最初に、最も派生したクラス (1.8) のコンストラクターの場合のみ、仮想基底クラスは、基底クラスの有向非巡回グラフの深さ優先の左から右への走査に現れる順序で初期化されます。 -to-right」は、派生クラス base-specifier-list 内の基本クラスの出現順序です。
— 次に、直接基底クラスは、base-specifier-list に表示される宣言順に初期化されます (mem-initializer の順序に関係なく)。
— 次に、非静的データ メンバーは、クラス定義で宣言された順序で初期化されます (これも mem-initializer の順序に関係なく)。
— 最後に、コンストラクター本体の複合ステートメントが実行されます。

(§12.6.2/12) mem-initializer の式リストまたは波括弧初期化リスト内の名前は、 mem-initializer が指定されているコンストラクターのスコープで評価されます。[ 例:

    class X {
      int a;
      int b;
      int i;
      int j;
    public:
      const int& r;
      X(int i): r(a), b(i), i(i), j(this->i) { }
    };

X::rを参照するようX::aに初期化しX::b、コンストラクタ パラメータの値で初期化し、コンストラクタ パラメータiX::ii初期化し、の値で初期化X::jしますX::i。これは、クラス X のオブジェクトが作成されるたびに行われます。— 例の終了 ]
[ 注: mem-initializer はコンストラクターのスコープで評価されるため、mem-initializerthisの式リストでポインターを使用して、初期化されるオブジェクトを参照できます。— エンドノート]

于 2012-10-09T05:44:58.560 に答える