在C ++构造函数中引导下划线的含义是什么?

时间:2009-10-19 21:19:36

标签: c++ syntax constructor arguments identifier

好吧我不是一个非常有经验的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;
  ...

8 个答案:

答案 0 :(得分:9)

没什么特别的。他只是将其命名为区分成员变量和参数名称。

Underscore是C ++标识符中的有效字符。

答案 1 :(得分:8)

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

答案 2 :(得分:8)

最有可能的是,代码的作者试图避免初始化列表中数据成员名称和构造函数参数名称之间的潜在冲突。很可能,作者并不知道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;
        ...

虽然对于没有准备的读者来说可能会让人感到困惑。

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

答案 3 :(得分:2)

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

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

在上面的例子中:

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

答案 4 :(得分:1)

它们只是传入参数的名称。它们碰巧匹配成员变量并用于初始化器。

没有特别的意义 - 这只是一些人可能会使用的惯例。

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

因此,当我遇到需要混合并匹配本地,成员和参数变量的情况时,我知道我正在处理哪些变量。

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

答案 7 :(得分:0)

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

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