46

I've seen people use a trailing underscore for member variables in classes, for instance in the renowned C++ FAQ Lite.

I think that it's purpose is not to mark variables as members, that's what "m_" is for. It's actual purpose is to make it possible to have an accessor method named like the field, like this:

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

Having accessors omit the "get_" part is common in the STL and boost, and I'm trying to develop a coding style as close to these as possible, but I can't really see them using the underscore trick. I wasn't able to find an accessor in STL or boost that would just return a private variable.

I have a few questions I'm hoping you will be able to answer:

  1. Where does this convention come from? Smalltalk? Objective-C? Microsoft? I'm wondering.
  2. Would I use the trailing underscore for all private members or just as a workaround in case I want to name a function like a variable?
  3. Can you point me to STL or boost code that demonstrates trailing underscores for member variables?
  4. Does anybody know what Stroustrup's views on the issue are?
  5. Can you point me to further discussion of the issue?
4

7 に答える 7

38

C++ では、

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

実装に予約されています。(これについての詳細は、ここで見つけることができます。) これらのルールを覚えようとするのではなく、多くの人は単純にアンダースコアで始まる識別子を使用しません。そのため、末尾のアンダースコアが発明されました。

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

ゲッター/セッターに関しては、それらは忌まわしきものであり、私が嫌いな準クラスの確かな兆候です。

于 2010-09-06T12:13:08.057 に答える
16

The C++ Programming Languageを読みましたが、Stroustrup はメンバーの命名規則を一切使用していません。彼は決してする必要はありません。単一の単純なアクセサー/ミューテーターはありません。彼は非常に優れたオブジェクト指向設計を作成する方法を持っているため、同じ名前のメソッドを持つ必要はありません。彼は、単純なデータ構造が必要なときはいつでも、パブリック メンバーを持つ構造体を使用します。彼のメソッドは常に操作のようです。また、彼が 1 文字だけ異なる名前の使用を推奨していないこともどこかで読みました。

于 2010-09-28T15:32:33.493 に答える
13

私は個人的にこのガイドラインの大ファンです:http://geosoft.no/development/cppstyle.html

これには、m_プレフィックスの省略、プライベートメンバー変数を示すためのアンダースコアサフィックスの使用、スペースの代わりにアンダースコアを使用するという恐ろしい、タイプするのが面倒な習慣の削除、およびboolの適切な命名などの他のより詳細で具体的な提案が含まれます(isDone代わりに)だけのdone)といくつかの名前のgetVariable()代わりに使用します。variable()

于 2010-09-06T11:15:01.067 に答える
11

自分自身のことだけを言えば...私は、アクセサー関数があるかどうかに関係なく、プライベートデータメンバーには常に末尾のアンダースコアを使用します。私が m_ を使用しない主な理由は、変数の名前を精神的にスペルするときに邪魔になるからです。

于 2010-09-06T10:25:05.460 に答える
5

検索性が好きなメンテナンス開発者として、私はより検索しやすいものに傾倒してm_います。私のように、大規模なクラスを持つ大規模なプロジェクトを管理しているとき (質問しないでください)、「うーん、状態を変更するのは誰?」と疑問に思うことがあります。で検索m_するとヒントが得られます。

ローカル変数を示すために使用することも知られていl_ますが、現在のプロジェクトではそれを使用していないため、最近は「クリーン」です。

私はハンガリー語表記のファンではありません。C++ には強力な型システムがあり、代わりにそれを使用します。

于 2010-09-06T16:34:27.863 に答える
3

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

ただし、C の場合、先頭にアンダースコアを付けるのは得策ではないため、C++ FAQ Lite による末尾のアンダースコアへの推奨事項を推測します。

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

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


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

于 2010-09-06T12:30:02.427 に答える
1

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

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

于 2010-09-06T11:25:43.537 に答える