在c++类成员名中使用下划线的约定



我的大部分编程知识都是自学的,所以从来没有人教过我正确的设计模式、约定等等。

最近我一直在研究公司的很多软件库,我注意到很多类数据成员的名字中都有下划线。

例如:

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?
}

就我个人而言,我把下划线放在末尾而不是开头[如果你不小心在前面的下划线后面加了一个大写字母,你的代码就会变得不规范]。有些人写mBlahm_Blah。其他人什么也不做,并且在可能出现混淆时显式地使用this->blah来指示其成员变量。没有全球标准;只要在私有项目中做你想做的,并在其他地方坚持现有的实践。

我看到_在成员前面键入,只是为了通知读者它是类成员变量

我看到的更传统的方法是输入m_;即m_data;

当成员为私有时,通常在成员前使用下划线。

在没有内置方法来声明成员private的语言(如python)中非常有用。

通常在成员变量中使用下划线来区分成员变量,静态成员变量&局部变量。

m_用于普通成员变量&
s_用于静态成员变量

这样,变量的作用域在变量名中就可见了。


此外,有时在成员名中使用下划线,以便您可以使用成员名本身来命名getset方法。

例如:

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
    }
}; 

然而,不同的组织采用不同的惯例&编程风格,你应该坚持它们。遵循原则,
入乡随俗

我不认为有一个通用的命名规则。然而,最重要的一点是要坚持在你的公司/项目中已经使用的。不要打破它。否则,你的技术主管或导师很可能会向你提出质疑。

命名的Google c++风格

我学到的是,在变量之前或之后有下划线意味着它是该类的成员——私有的、公共的或受保护的。

这样做的原因是,以下划线开头的成员名在智能感知中首先显示。一般来说,您必须遵循您所参与的项目的惯例。如果你正在开始一个新项目,遵循一个普遍接受的惯例是一个好主意,比如Sutter和Alexandrescu的c++编码标准。

最新更新