构造函数的参数命名

Che*_*eng 3 c++

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

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

private int x;
Run Code Online (Sandbox Code Playgroud)

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

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

private:
    int x;
Run Code Online (Sandbox Code Playgroud)

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

小智 5

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

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

虽然我也常常为成员使用风格名称(例如_x),但我是为非公开成员做的.如果x在这个例子中是公开的,我会像这样做,并且如果我认为它更具可读性,请查看重命名ctor的参数.

编辑:由于人们似乎越来越偏离,我会澄清_x.该标准保留了一些标识符名称:

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

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

  • 数据成员不在全局命名空间中. (4认同)
  • 你不应该使用前导下划线来命名 (3认同)
  • -1.C++标准17.4.3.1.2/1:"**每个以下划线开头的名称**都保留给实现,以用作全局命名空间中的名称." (3认同)
  • 数据成员可以隐藏全局命名空间的成员.这可能是不受欢迎的行为. (2认同)
  • 例如,实现可以在`operator new`中使用`_x`.这意味着每次在类实现中调用全局`operator new`时,您将在`A :: _ x`中获得未定义的值. (2认同)