尾随下划线的C ++中的成员variables
我已经看到人们在类中为成员variables使用尾部下划线,例如着名的C ++ FAQ Lite 。
我认为它的目的不是将variables标记为成员,这就是“m_”的用途。 它的实际目的是使得像这个字段这样命名的访问器方法成为可能:
class Foo { public: bar the_bar() { return the_bar_; } private: bar the_bar_; }
有访问者省略“get_”部分在STL和boost中很常见,我试图尽可能地开发一种编码风格,但是我不能用下划线技巧来看到它们。 我无法在STL中find一个访问器,或者只是返回一个私有variables。
我有几个问题希望你能回答:
- 这个惯例从哪里来? 短暂聊天? Objective-C的? 微软? 我在想。
- 我会使用尾部下划线为所有私人成员或只是作为一种解决方法,以防我想命名一个函数像variables?
- 你可以指向我的STL或增强代码,演示成员variables的尾部下划线?
- 有谁知道Stroustrup对这个问题的看法是什么?
- 你能指点我进一步讨论这个问题吗?
在C ++中,
- 标识符以下划线开头,后跟大写字母
- 标识符在任何地方有两个连续的下划线
- 全局名称空间中的标识符以下划线开头
保留给执行。 (关于这方面的更多信息可以在这里find。)许多人不用记住这些规则,而是使用以下划线开头的标识符。 这就是为什么最后的下划线是发明了。
然而,C ++本身已经很老了,build立在40年的C之上,它们都从来没有一个公司背后,还有一个标准库,在过去几十年里已经“成长”了,而不是一个单一的创造行为。 这使得存在许多不同的命名约定。 私有数据的尾部下划线(或仅用于私人数据)只是一个,许多使用其他的(其中很less有人争辩说,如果你需要用下划线来告诉私人成员局部variables,你的代码不够清晰)。
对于获得者/定居者来说,他们是一种可憎的东西,也是我所讨厌的“ 准类 ”的确切标志。
我读过C ++编程语言 ,Stroustrup没有使用任何types的约定来命名成员。 他从不需要; 没有一个简单的accessor / mutator,他有一种创build非常好的面向对象devise的方法,所以不需要有一个同名的方法。 只要他需要简单的数据结构,他就会使用公共成员的结构。 他的方法似乎总是运作 。 我也读过一些地方,他不鼓励使用只有一个字符的名字。
我个人非常喜欢这个指南: http : //geosoft.no/development/cppstyle.html
它包括省略m_前缀,使用下划线后缀表示私有成员variables,并放弃使用下划线而不是空格的令人讨厌的令人讨厌的习惯,以及其他更详细和具体的build议,例如适当地命名布尔( isDone
而不是刚刚done
)和使用getVariable()
而不是只是variable()
仅举几例。
只为自己说话…我总是使用尾随下划线为私人数据成员,不pipe他们是否有访问者function。 我不使用m_主要是因为当我精神上拼写variables的名字时会受到阻碍。
作为一个喜欢search的维护开发人员,我倾向于更多的search。 当你和我一样,保持着大class级的大项目(不要问),你有时会想:“嗯,谁改变了状态?” 快速searchm_
可以给出提示。
我也知道使用l_
来表示局部variables,但是当前的项目并没有使用,所以我现在是“干净的”。
我不是匈牙利符号的粉丝。 C ++有一个强大的types系统,我用它来代替。
我猜测乌托邦本来就是用一个前导下划线 – 这在Java和C#中对于成员来说是相当普遍的。
但是,对于C来说,主要的下划线不是一个好主意,所以我推测C ++ FAQ Lite的build议是去掉尾部的下划线:
所有以下划线和大写字母或其他下划线开头的标识符总是保留用于任何用途。
以下划线开始的所有标识符总是被保留用作普通标签和标签名称空间中具有文件范围的标识符。
(ISO C99规范,第7.1.3节)
据我所知,这不是微软推动成员的尾部下划线代码样式。
我已经读过,Stroustrup是尾随下划线。