【问题标题】:What is the meaning of leading underscores in a C++ constructor?C ++构造函数中前导下划线的含义是什么?
【发布时间】:2010-12-08 03:40:15
【问题描述】:

好的,我不是一个非常有经验的 C++ 程序员,但我想知道以下构造函数的参数中的下划线有什么意义?

class floatCoords
 {
 public:
  floatCoords(float _x, float _y, float _width, float _height)
   : x(_x), y(_y), width(_width), height(_height)
  {

  }
  float x, y, width, height;
  ...

【问题讨论】:

    标签: c++ syntax constructor arguments identifier


    【解决方案1】:

    没什么特别的。他只是这样命名,以区分成员变量和参数名称。

    下划线是 C++ 标识符中的有效字符。

    【讨论】:

    • 另外,通常成员变量按照惯例有下划线,而构造函数参数没有。不过,这完全取决于本地编码约定。有些商店要求在会员前面加上“m_”。不过,请远离双下划线(保留供编译器使用)。见:*.com/questions/1228161/…
    • 我已经看到足够多的代码表明私有成员的名称中没有任何东西是常规的,更不用说下划线了。
    • 另请注意,这种区分在 ctor-initializer 中并不是绝对必要的 - 成员的名称查找仅查找成员,而初始化程序内部的名称查找将首先找到参数名称。
    • 就像我说的,地方惯例:google-styleguide.googlecode.com/svn/trunk/… Guess @coppro 的意思一般。哪个是对的。
    【解决方案2】:

    这只是一个方便的命名约定,对语言没有任何意义。请确保不要使用大写字母:What does double underscore ( __const) mean in C?

    【讨论】:

    【解决方案3】:

    很可能,代码的作者试图避免初始化列表中数据成员名称和构造函数参数名称之间的潜在冲突。很可能,作者没有意识到 C++ 查找规则确保无论如何都不会发生冲突这一事实。 IE。下面的代码也会产生预期的结果

    class floatCoords    {
        public:
            floatCoords(float x, float y, float width, float height)
                    : x(x), y(y), width(width), height(height)
            {
            }
            float x, y, width, height;
            ...
    

    虽然它可能会让没有准备的读者感到困惑。

    当然,在构造函数体内,参数名称会隐藏成员名称,因此需要使用this->...或限定名称来访问数据成员。代码的作者很可能也试图避免这种情况。

    【讨论】:

    • 有趣,不知道这个花絮。但是,在我看来,使用与成员变量名称不匹配的参数名称仍然会更好。在这种情况下,您可以使用 x 和 y 作为 ctor 中的参数,但是如果您编写 setX 和 setY 方法,则必须使用不同的参数名称。我更喜欢在整个类中保持我的参数名称一致。
    • @ThisSuitIsBlackNot:不一定。 this->member 语法让您实现 setXsetY 方法,即使参数名称隐藏了成员名称。一些编码标准实际上要求类成员总是通过this->member 语法访问(其中有一定的价值,我不得不承认)。
    • @AndreyT:你说得很好。如果一致使用,this->member 语法非常清晰(我在许多 Java 类中都看到过这种格式)。但是,当您忘记“this->”部分时会发生什么?我不确定行为是什么,但我想这在大型项目中经常发生。即使没有发生任何可怕的事情,代码中的不一致也会困扰我(我在这里挑剔)。
    【解决方案4】:

    这些只是不同的人/机构假设的变量命名约定。乍一看这似乎没有必要,但实际上在读写代码时非常有用,尤其是当您有同名的参数和成员变量时。例如。你通常可以有这三种情况:

    class A {
      void foo(int age_) { //parameter
        int age = 18; //local scope
        if (age_ > age) cout << legal << endl;
      }
      int _age; //member
    };
    

    在上面的例子中:

    • _variable - 表示这是一个类成员变量
    • variable_ - 表示这是函数的参数
    • 变量 - 表示这只是函数范围内的常规变量

    【讨论】:

    • 和 _Variable 侵入实施者命名空间。
    【解决方案5】:

    它们只是传入参数的名称。它们恰好匹配成员变量并用于初始化程序。

    没有特殊含义 - 这只是某些人可能使用的约定。

    【讨论】:

      【解决方案6】:

      它们没有句法意义。但是,如果您有一堆字段(例如xywidthheight),通常的约定是使用字段名称加上前导下划线来命名初始化它们的构造函数参数。

      【讨论】:

        【解决方案7】:

        那些下划线的目的是为了区分参数变量float _x和成员变量float x。在语法上,由于下划线,没有添加特殊含义。我个人更喜欢在所有参数前加上 a_ 前缀,并在我必须编写 C++ 代码时为所有成员变量加上 m_ 前缀。

        所以当我遇到必须混合和匹配本地变量、成员变量和参数变量的情况时,我知道我正在处理哪些变量。

        int y = a_x * 2;
        m_x = y + 3;
        

        【讨论】:

          【解决方案8】:

          因为如果您命名 den float x、float y 等,您将无法访问该类的实际字段,因为它们具有相同的名称。

          它与语言无关,只是实际程序员的约定(我认为是为了使代码更明显)

          【讨论】: