我的大部分编程知识都是自学的,所以从来没有人教过我正确的设计模式、约定等等。
最近我一直在研究公司的很多软件库,我注意到很多类数据成员的名字中都有下划线。
例如:class Image
{
// various things
// data members
char* _data;
ImageSettings* _imageSettings;
// (and so on...)
};
我在很多在线示例代码中也看到了这一点。这个惯例背后有什么原因吗?对不起,我不能提供更好的例子,我真的试图记住我的头,但我看到它很多。
我知道匈牙利符号,但我正试图掌握c++ OOP编程中使用的所有其他约定。
只是为了明确哪些变量是成员,哪些不是。没有更深的含义。在实现成员函数时,混淆的可能性更小,并且可以选择更简洁的名称。
void Class::SomeFunction() {
int imageID;
//...
SetID(imageID + baseID); //wait, where did baseID come from?
}
就我个人而言,我把下划线放在末尾而不是开头[如果你不小心在前面的下划线后面加了一个大写字母,你的代码就会变得不规范]。有些人写mBlah
或m_Blah
。其他人什么也不做,并且在可能出现混淆时显式地使用this->blah
来指示其成员变量。没有全球标准;只要在私有项目中做你想做的,并在其他地方坚持现有的实践。
我看到_
在成员前面键入,只是为了通知读者它是类成员变量。
我看到的更传统的方法是输入m_
;即m_data
;
当成员为私有时,通常在成员前使用下划线。
在没有内置方法来声明成员private的语言(如python)中非常有用。
通常在成员变量中使用下划线来区分成员变量,静态成员变量&局部变量。
m_
用于普通成员变量&s_
用于静态成员变量
这样,变量的作用域在变量名中就可见了。
此外,有时在成员名中使用下划线,以便您可以使用成员名本身来命名get
和set
方法。
例如:
class Image
{
// various things
// data members
char* _data;
ImageSettings* _imageSettings;
// (and so on...)
public:
ImageSettings* imageSettings()
{
//return pointer
}
void imageSettings(ImageSettings *ptr)
{
//set member variable value
}
};
然而,不同的组织采用不同的惯例&编程风格,你应该坚持它们。遵循原则,
入乡随俗
我不认为有一个通用的命名规则。然而,最重要的一点是要坚持在你的公司/项目中已经使用的。不要打破它。否则,你的技术主管或导师很可能会向你提出质疑。
我学到的是,在变量之前或之后有下划线意味着它是该类的成员——私有的、公共的或受保护的。
这样做的原因是,以下划线开头的成员名在智能感知中首先显示。一般来说,您必须遵循您所参与的项目的惯例。如果你正在开始一个新项目,遵循一个普遍接受的惯例是一个好主意,比如Sutter和Alexandrescu的c++编码标准。