web-dev-qa-db-ja.com

C ++メンバー変数

次のクラスを考えてみましょう:

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

次の3つの方法で「setNumber」を実装できます。

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

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

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

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

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

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

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

17
Julian

これは主に個人的な好みですが、多くの小さなゲームが同時に行われている(したがって、私の周りで多くのコーディングスタイルが使用されている)企業内からの問題についての私の見解を共有させてください。

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

オプション1:

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

まず、多くのプログラマーは、これを煩わしく感じる傾向があり、継続的に「this->」と入力します。 2番目に、さらに重要なことに、変数のいずれかがパラメーターまたはローカル変数と名前を共有している場合、「置換」と言うように設計された検索置換、「番号」の名前を変更すると、次のように検索置換スコープにあるメンバー変数に影響を与える可能性があります上手。

オプション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'のようなものを追加する傾向がある場合、このスタイルはうまくメッシュ化され、読者に期待されます。

16
Kerr

それはスタイルの問題なので、個人的な好み、または作業しているチームや作業しているチームのボスの好みです。

8
user405725

オプション4

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

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

7
Luchian Grigore

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

方法2は、Class :: memberが通常静的メンバー変数を示すため、劣っています。パラメーターとメンバー変数を明確にするために使用すると混乱を招きます。

2
JohnMcG

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

しかし、これは高い非言語レベルでのそれについての良い議論です

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

2
nate_weldon

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

オプション4

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

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

0
user195488