18

次のクラスについて考えてみます。

class A
{
  A();
  int number;
  void setNumber(int number);
};

'setNumber'は次の3つの方法で実装できます。

方法1:「this」ポインタを使用します。

void A::setNumber(int number)
{
  this->number = number;
}

方法2:スコープ解決演算子を使用します。

void A::setNumber(int number)
{
  A::number = number;
}

方法3:代わりに、すべてのメンバー変数を「m」または「_」で示します(これが私の推奨される方法です)。

void A::setNumber(int number)
{
  mNumber = number;
}

これは単なる個人的な好みですか、それとも特定の方法を選択することには利点がありますか?

4

6 に答える 6

17

これは主に個人的な好みですが、多くの小さなゲームが同時に作成されている会社の内部から、この問題に関する私の見解を共有させてください (そのため、私の周りでは多くのコーディング スタイルが使用されています)。

このリンクには、関連する優れた回答がいくつかあります。C++クラスのメンバー変数にプレフィックスを使用する理由

あなたのオプション 1:

void A::setNumber(int number)
{
  this->number = number;
}

まず第一に、多くのプログラマーはこれが面倒で、' this-> ' を連続して入力する傾向があります。次に、さらに重要なことに、変数のいずれかがパラメーターまたはローカル変数と名前を共有している場合、「番号」の名前を変更するように設計された検索置換は、検索置換スコープにあるメンバー変数に次のように影響する可能性があります。良い。

あなたのオプション 2:

void A::setNumber(int number)
{
  A::number = number;
}

これで私が遭遇した問題は、大規模なクラス、または大規模な関数を持つクラス (関数が表示されないか、クラスの名前が予期せず付けられている) では、A::(thing) の書式設定がアクセスに非常によく似ていることです。名前空間の一部であるため、誤解を招く可能性があります。もう 1 つの問題は、前のオプションの #2 と同じです。使用している変数に名前が似ていると、予期しない混乱が生じることがあります。

あなたのオプション 3:

void A::setNumber(int number) 
{
  mNumber = number;
}

これは、提示された 3 つのオプションの中で最も優れたものです。明確で意味のあるプレフィックスを含む構文を作成 (および保持) することで、ローカル (またはグローバル) 変数が共有しない一意の名前を作成するだけでなく、その変数が宣言されている場所をすぐに明確にします。あなたがそれを見つけた文脈に関係なく。私はそれがこの「 mVariable 」とこの「 m_variable 」の両方のように行われるのを見てきましたが、大文字の連結よりもアンダースコアを好むかどうかに大きく依存します。さらに、あなたのスタイルがポインターに対して ' p ' を追加したり、グローバルに対して ' g ' を追加したりする傾向がある場合、このスタイルはうまく調和し、読者に期待されます。

于 2012-04-17T20:26:38.187 に答える
8

それはスタイルの問題であり、したがって個人的な好み、または一緒に働いているチームまたはあなたが働いているチームのボスの好みです.

于 2012-04-17T19:46:33.723 に答える
7

オプション 4 :

void A::setNumber(int n)
{
  number = n;
}

メンバーとパラメーターに同じ名前を使用する利点があるのはなぜですか。これでは何も得られません。確かに、今では明らかですが、メソッドが大きくなり、プロトタイプが画面に収まらなくなり、他の開発者がコードを書いている場合、メンバーを修飾するのを忘れる可能性があります。

于 2012-04-17T19:46:19.100 に答える
2

そのすべての個人的な好み

しかし、これは言語以外の高いレベルでの良い議論です

https://stackoverflow.com/questions/381098/what-naming-convention-do-you-use-for-member-variables

于 2012-04-17T19:49:29.923 に答える
2

方法 1 と方法 3 のどちらを選択するかは、個人または組織のスタイルの問題だと思います。

Class::member は通常静的メンバー変数を示し、パラメーターとメンバー変数の間のあいまいさを解消するために使用すると混乱を招くため、方法 2 は劣っています。

于 2012-04-17T20:24:25.100 に答える
0

より良いバリアントを提供することで、ルシアンに同意します。あなたが提供する他の例は、あまりにも面倒または混乱しています。

オプション 4 :

void A::setNumber(int aNumber)
{
  theNumber = aNumber;
}

これは私の雇用主で使用しているコーディング標準の一部であり、あなたが説明していることは非常に明確です。ハンガリー表記ではありません。

于 2012-04-17T20:40:29.800 に答える