11

すべてのメンバー変数の前にm_を付けて、クラスを作成するときは常にいい子でした。

class Test {
    int m_int1;
    int m_int2;
public:
    Test(int int1, int int2) : m_int1(int1), m_int2(int2) {}
};

int main() {
    Test t(10, 20); // Just an example
}

しかし、最近私はそれをするのを忘れて、書くことになりました:

class Test {
    int int1;
    int int2;
public:
    // Very questionable, but of course I meant to assign ::int1 to this->int1!
    Test(int int1, int int2) : int1(int1), int2(int2) {}
};

信じられないかもしれませんが、コードはエラーや警告なしでコンパイルされ、割り当ては正しく行われました。自分がやったことに気付いたのは、コードをチェックインする前に最終チェックを行ったときだけでした。

私の質問は:なぜ私のコードはコンパイルされたのですか?そのようなものはC++標準で許可されていますか、それとも単にコンパイラが賢い場合ですか?ご参考までに、私はVisualStudio2008を使用していました。

4

5 に答える 5

26

はい、有効です。メンバー初期化子リストの名前は、コンストラクターのクラスのコンテキストで検索されるためint1、メンバー変数の名前が検索されます。

初期化式はコンストラクター自体のコンテキストで検索されるためint1、メンバー変数をマスクするパラメーターを見つけます。

于 2010-03-19T10:21:22.880 に答える
15

あなたがしたことは標準のC++です。初期化リストで初期化できるのはメンバー変数または基本クラスのみであるため、パラメーターの外側の変数は明確です。括弧内には、一般的なスコープ規則が適用され、メンバーはパラメーター名によって影が薄くなります。

于 2010-03-19T10:20:44.030 に答える
2

これは完全に正常な動作です。AATが正しく指摘しているように、あいまいさはありません。リストによって初期化される変数は、クラスメンバーである必要があります。これは標準であり、準拠しているすべてのコンパイラで機能します。

このようなリストを使用するときに覚えておくべき唯一のことは、この種のコードを理解していない人はそれを維持しなければならないかもしれないということです。自分が何をしているのかを知っている限り、このような初期化コードを書くことに何の問題もありません。

于 2010-03-19T10:22:06.217 に答える
0

初期化リストでint1を使用していたため、これが機能すると思います。初期化できるのはメンバー変数だけです=>実際、どの変数が初期化されているかは明確でした。

すべてのC++コンパイラがこの寛容であるかどうかは別の問題です!

于 2010-03-19T10:15:40.407 に答える
0

あなたがしたことは正常です。この種の実装では、「this」ポインター(この場合)を使用することさえできなくなります。

于 2010-03-19T20:18:05.183 に答える