2

以前はこれを行うことができ、意図したとおりに機能していたことを思い出します。

class foobar
{
public:
    foobar(int x, int y)
    {
        x = x; //the variables x, y belonging to the class got correctly initialized
        y = y;
    }

private:
    int x, y;
};

上記は、Microsoft Visual C++ 6.0 以降のいくつかのバージョンで 200x 前後で動作したと思います。
しかし、今は Microsoft Studio 2013 でこれを行う必要があり、次this->のように使用する必要があります。

class foobar
{
public:
    foobar(int x, int y)
    {
        this->x = x; //the other way no longer initializes class vars
        this->y = y;
    }

private:
    int x, y;
};

言語仕様の変更または Microsoft コンパイラの変更はありましたか?

4

2 に答える 2

8

おそらく、初期化子リスト構文の代わりに考えているでしょう。これ明確であり、(バグのない) C++ コンパイラで正しく動作するはずです。

foobar(int x, int y) : x(x), y(y) { }

この場合、括弧の前のxandyは明確にデータ メンバーです。これは、(親型のコンストラクターを除いて) そこに移動できる唯一のものであるためです。括弧内では、データ メンバーをシャドウするコンストラクター引数を参照しますxy

x = x;no-op 自己代入以外のことを行う状況は考えられません(バグのあるユーザー定義の代入演算子のオーバーロードは別として)。これが以前の VC++ バージョンで機能した場合、VC++ コンパイラのバグでした。おそらく、初期化子リストの構文 (これは機能します) を使用していて、それを忘れていました。

于 2014-11-06T16:56:29.860 に答える
2

またはこれ。

class foobar {
public:
    foobar(int x, int y) : x(x), y(y)
    {
    }

private:
    int x, y;
};
于 2014-11-06T16:56:57.910 に答える