3

これは、私が C++ をプログラミングするときによく行うことであり、これが「悪い」習慣ではないかとしばらく考えていました (この動作は標準化されていますか?)。

クラスがあるとしましょう:

Class Foo {
  public:
    Foo(int x) {
      //this->x is the member "x" of Foo
      //x is the paramater "x" to the function
      this->x = x; //Sets Foo::x to x (parameter x)
    }

  private:
    int x;


};

のメンバ変数と同じ名前Foo::Foo(int x)のパラメータがどのように命名されているかに注目してください。xFoo

私は通常、 useを使用this->x = x;してメンバー変数にパラメーターの値を割り当てますが、これは私にとってはうまくいくようです (私は通常 MSVC を使用します)。MSVC (および私が思う GCC) では、アクセスは、という名前のメンバーではなく、xという名前のパラメーターにアクセスします。これはすべての C++ コンパイラで標準化された動作ですか? コンパイラがパラメーター変数ではなくメンバー変数だけに関連付けるのを止めるものはありますか? (例:と同等)xxxthis->x;this->x = this->x;

4

3 に答える 3

5

はい、準拠したコンパイラを使用すると、パラメーターxは member を非表示にしますx。ただし、あなたが書いたもののより興味深い代替案は次のとおりです。

class Foo {
public:
    Foo(int x) : x(x) {}
private:
    int x;
};

読めないことを除けば、実際にあなたが望むことを正確に行います。

于 2013-10-18T23:41:52.537 に答える
5

標準に準拠したコンパイラであれば、あなたがしていることを実行できますが、コードは読みにくいというRobに同意します。

命名規則は非常に重要です。命名規則を選択し、同じプログラム内で決して変更しないでください。

私は C++ でプログラミングするときにこのガイドを使用します: http://geosoft.no/development/cppstyle.html これは最も一般的な命名規則のリストであり、それぞれにその特定の命名規則が選択された理由に関する短い説明が含まれています。このリストをコピーして、好みに合わせてカスタマイズします。

項目#11(命名規則の下)は、あなたの質問に直接対処し、はるかに優れた代替手段を提供します.

于 2013-10-18T23:52:54.010 に答える