web-dev-qa-db-ja.com

C ++のメンバー変数の末尾の下線

たとえば、有名な C++ FAQ Lite 。)で、クラスのメンバー変数に下線が使用されるのを見ました.

変数をメンバーとしてマークすることは目的ではないと思います。それが「m_」の目的です。実際の目的は、次のようにフィールドのような名前のアクセサメソッドを持つことを可能にすることです。

class Foo {
public:
    bar the_bar() { return the_bar_; }
private:
    bar the_bar_;
}

アクセサーに「get_」部分を省略することはSTLおよびブーストで一般的であり、できるだけこれらに近いコーディングスタイルを開発しようとしていますが、アンダースコアトリックを使用してそれらを実際に見ることはできません。プライベート変数を返すだけのSTLまたはBoostでアクセサーを見つけることができませんでした。

私はあなたが答えられることを望んでいるいくつかの質問があります:

  1. このコンベンションはどこから来たのですか? Smalltalk? Objective-C?マイクロソフト?不思議なんだけど。
  2. すべてのプライベートメンバーに末尾のアンダースコアを使用しますか、または変数のような関数に名前を付けたい場合の回避策として使用しますか?
  3. メンバー変数の末尾のアンダースコアを示すSTLまたはブーストコードを教えてもらえますか?
  4. この問題に関するStroustrupの見解が誰か知っていますか?
  5. この問題についてさらに議論するようにお願いできますか?
41
eomer

C++では、

  1. アンダースコアで始まり、その後に大文字が続く識別子
  2. 任意の場所に2つの連続したアンダースコアを持つ識別子
  3. アンダースコアで始まるグローバル名前空間の識別子

実装専用です。 (これについての詳細は here にあります。)これらの規則を覚えようとするのではなく、多くの人は単にアンダースコアで始まる識別子を使用しません。それが最後のアンダースコアが発明された理由です。

ただし、C++自体は古く、40年のCに基づいて構築され(どちらも単一の会社を所有したことはありません)、単一の行為として導入されるのではなく、数十年にわたって「成長」した標準ライブラリを備えています創造の。これにより、多くの異なる命名規則が存在することになります。プライベート(またはプライベートデータのみ)の末尾のアンダースコアは1つですが、多くは他のアンダースコアを使用します(ローカル変数からプライベートメンバーを識別するためにアンダースコアが必要な場合、コードが十分に明確ではないことを主張する人も少なくありません)。

ゲッター/セッターに関しては-それらは憎むべきものであり、の確かな兆候です 準クラス "、これは嫌いです。

32
sbi

C++プログラミング言語を読みましたが、Stroustrupはメンバーの命名規則を一切使用していません。彼はする必要はありません。単一の単純なアクセサー/ミューテーターはありません。彼は非常に優れたオブジェクト指向のデザインを作成する方法を持っているので、同じ名前のメソッドを持つ必要はありません。彼は、単純なデータ構造が必要なときはいつでも、公開メンバーと共に構造体を使用します。彼の方法は常にoperationsのようです。私はどこかで、彼が1文字だけ異なる名前の使用を奨励していないことも読んでいます。

16
forceal

自分だけのために...プライベートデータメンバーには、アクセサー関数があるかどうかに関係なく、常に末尾のアンダースコアを使用します。主に変数の名前を綴るときに邪魔になるため、私はm_を使用しません。

9
usta

私は、ユートピアが先頭のアンダースコアを使用することだったのではないかと推測しています。これはJavaおよびメンバーのC#で非常に一般的です。

ただし、Cの場合、先頭のアンダースコアは良いアイデアではないため、C++ FAQ Liteで末尾のアンダースコアに進むことをお勧めします。

アンダースコアと大文字または別のアンダースコアのいずれかで始まるすべての識別子は、常に使用するために予約されています。

アンダースコアで始まるすべての識別子は、通常の名前空間とタグ名前空間の両方でファイルスコープを持つ識別子として使用するために常に予約されています。


(ISO C99仕様、セクション7.1.3)

3
StuartLC

私が覚えている限りでは、メンバーの末尾のアンダースコアコードスタイルをプッシュしたのはMicrosoftではありません。

Stroustrupは末尾のアンダースコアがプロであることを読みました。

1