3

私はこのように定義されたクラスを持っています:

class MyClass 
{
    int x;
    public: 
        MyClass(int x); 
};

MyClass::MyClass(int x)
{ //Assign x here 
}

ただし、xコンストラクターはインスタンス変数と同じ名前であるため、コンストラクターで初期化できません。これを回避する方法はありますか(引数の名前を変更する以外に)?

4

9 に答える 9

13

最良のオプションは、コンストラクターの初期化子リストを使用することです。

MyClass::MyClass(int x) : x( x ) { // Body }

ただし、このアプローチを試すこともできます。

MyClass::MyClass(int x) { this->x = x; }
于 2010-02-02T19:41:32.427 に答える
9

ただし、インスタンス変数と同じ名前であるため、コンストラクターでxを初期化できません。これを回避する方法はありますか(引数の名前を変更する以外に)?

したがって、パラメータの名前を変更してください。

class MyClass  
{ 
    int x; 
    public:  
        MyClass(int xInitVal);  
}; 

MyClass::MyClass(int xInitVal)
    :x(xInitVal)
{ // Don't assign x here.  
} 

パラメータ名をローカルと同じにすることで、コードが読みにくくなります。

しないでください。あなたが出くわすほとんどすべてのスタイルガイドは、パラメータをメンバーと同じ名前にしないようにあなたに言うでしょう。

于 2010-02-02T19:55:30.293 に答える
3

余談ですが、実際には、衝突しないメンバー変数の命名規則が必要です。これは通常、C++ハウスのコーディングルール1または2です。次に、m_foo = barを見ると、何が起こっているのかが正確にわかります。

を使用しております

 int m_thingy;

私も見ました

 int _thingy;
 int thingy_

あなたがこれを知っていて、それをすることができなかったか、またはしなかったならば、前もって謝罪します

于 2010-02-02T19:45:04.917 に答える
2

this->x = x;

于 2010-02-02T19:41:30.400 に答える
2

this現在のオブジェクトを明示的に参照するために使用できます。

this->x = x;
于 2010-02-02T19:41:50.087 に答える
1

変数名を変更することを強くお勧めします。重複する識別子をいじることは、理由のない戦いです。

私のコードでは、すべての関数パラメーターに接頭辞'in'( "inValue")を付けています。すべてのプライベートメンバー変数にプレフィックス'm'( "mValue")を付けます。

于 2010-02-02T20:54:17.973 に答える
0

this->x代わりに使用してください。

于 2010-02-02T19:41:30.587 に答える
0

このポインタを使用する

MyClass::MyClass(int x)
{
    this->x = x;
}

もちろん、そもそもそのような名前の衝突がない方が良い解決策になるでしょう。

于 2010-02-02T19:42:27.340 に答える
0

this-> x = xが機能していませんか?それが私たちがしたことです(または別のパラメーター名を使用しました)。

于 2010-02-02T19:43:28.210 に答える