命名函数参数与类成员相同

Bra*_*rad 3 c++ standards

这是我在编写C++时常常做的事情,而且我一直想知道它是一个"坏"的习惯(这种行为是标准化的吗?)

让我们说我有一节课:

Class Foo {
  public:
    Foo(int x) {
      //this->x is the member "x" of Foo
      //x is the paramater "x" to the function
      this->x = x; //Sets Foo::x to x (parameter x)
    }

  private:
    int x;


};
Run Code Online (Sandbox Code Playgroud)

请注意,如何Foo::Foo(int x)命名参数,该参数x的名称与成员变量的名称相同Foo.

我通常只是使用use this->x = x;来为成员变量赋值参数的值,这似乎对我有用(我通常使用MSVC).在MSVC(和我认为的GCC)中,访问x将访问名为的参数x而不是名为的成员x.这是所有c ++编译器的标准化行为吗?有没有什么能阻止编译器只x与成员变量而不是参数变量相关联?(例如:this->x;相当于this->x = this->x;)

Rob*_*obᵩ 5

是的,使用任何兼容的编译器,该参数x将隐藏该成员x.然而,你所写的更有趣的替代方案是:

class Foo {
public:
    Foo(int x) : x(x) {}
private:
    int x;
};
Run Code Online (Sandbox Code Playgroud)

除了不可读之外,它实际上会完全按照你的意愿行事.


Jas*_*chs 5

我同意Rob的看法,任何符合标准的编译器都会让你做你正在做的事,但你的代码很难阅读.

命名约定非常重要.选择一个命名约定,永远不要在同一个程序中更改它.

在使用C++进行编程时,我使用本指南:http: //geosoft.no/development/cppstyle.html 这是最常见的命名约定列表,每一个都包含一个简短的声明,说明为什么选择了特定的命名约定.复制此列表并根据自己的喜好自定义.

项目#11(在命名约定下)直接解决您的问题,并为您提供更好的选择.

  • +1,提供出色的建议,即使这不能回答他的问题.他没有问"我该怎么办?",他问"编译器做了什么?" 我想他已经知道他不应该做他做的事. (2认同)