构造函数的参数命名

时间:2009-11-23 03:14:22

标签: c++

在Java中,通常,我可以将构造函数的参数与成员变量同名。

public A(int x)
{
    this.x = x;
}

private int x;

在C ++中,我不能。通常,我必须这样做。

public:
    A(int x_) : x(x_) 
    {
    }

private:
    int x;

还有更好的方法吗?由于构造函数参数名称看起来很难看,当IDE IntelliSense弹出构造函数参数窗口时。

6 个答案:

答案 0 :(得分:5)

在C ++中,如果需要,您可以:

struct A {
  int x;
  A(int x) : x(x) {
    foo(this->x);
    // if you want the member instead of the parameter here
  }
};

虽然我也经常为成员使用样式名称(例如_x),但我会为非公开成员执行此操作。如果x是公开的,如本例所示,我会这样做,如果我认为它更具可读性,请查看重命名ctor的参数。

编辑:由于人们似乎陷入了困境,我将在_x澄清。该标准保留了一些标识符名称:

  • 在任何名称空间中具有两个相邻下划线的任何名称
  • 任何名称空间中带有前导下划线后跟大写字母的任何名称
  • 在全球范围内具有前导下划线的任何名称

由于成员的范围限于该类,因此它们不属于第三类。也就是说,不继续偏离轨道会很好。 :)如果您愿意,可以随意在C ++中询问有关保留标识符的问题,并在评论中发布链接。

答案 1 :(得分:3)

您实际上可以在C ++中使用Java方式:

public:
    A(int x)
    {
        this->x = x;
    }

但是,也可以只说x(x):

public:
    A(int x) : x(x) { }

答案 2 :(得分:3)

C ++很聪明,可以找出你的意思x,你可以写:

class A {
  int x;
  A( int x ) : x(x) {};
};

答案 3 :(得分:1)

Google style是使成员具有尾随下划线:

public:
  A(int x) : x_(x) {
  }

private:
  int x_;

更漂亮。

答案 4 :(得分:1)

我不认为这是可能的。但是,我强烈建议对成员变量使用一致的命名约定,以区别于参数和局部变量。

在我的公司中,我们通常用'm'前缀表示成员变量,例如:

int mMyMemberVariable;

int m_MyMemberVariable;

这只是一种风格的例子 - 一致性是关键。

答案 5 :(得分:0)

一种方式(有些人可能会认为这是C ++方式)将在类的字段前加上m_,以消除字段和构造函数参数名称之间的歧义。