当局部变量具有相同名称时,如何在C++中分配实例变量?

Mik*_*ike 2 c++ instance-variables

我有一个这样定义的类:

class MyClass 
{
    int x;
    public: 
        MyClass(int x); 
};

MyClass::MyClass(int x)
{ //Assign x here 
}
Run Code Online (Sandbox Code Playgroud)

但是,我无法x在构造函数中初始化,因为它与实例变量具有相同的名称.有没有办法绕过这个(除了更改参数的名称)?

Naa*_*aff 12

最好的选择是使用构造函数的初始化列表:

MyClass::MyClass(int x) : x( x ) { // Body }
Run Code Online (Sandbox Code Playgroud)

但你也可以尝试这种方法:

MyClass::MyClass(int x) { this->x = x; }
Run Code Online (Sandbox Code Playgroud)

  • 认真.你无法建议他使用更好的名字 (5认同)
  • @dirkgently - 阴影可能不太理想,但它是有效的C++.我们可以整天讨论阴影,但他想知道的是C++语义. (2认同)

Mar*_*ork 8

但是,我无法在构造函数中初始化x,因为它与实例变量具有相同的名称.有没有办法绕过这个(除了更改参数的名称)?

所以改变参数的名称!

class MyClass  
{ 
    int x; 
    public:  
        MyClass(int xInitVal);  
}; 

MyClass::MyClass(int xInitVal)
    :x(xInitVal)
{ // Don't assign x here.  
} 
Run Code Online (Sandbox Code Playgroud)

通过使参数名称与本地相同,您只需使代码难以阅读.不要这样做.您遇到的几乎所有样式指南都会告诉您不要使参数与成员同名.请一点点常识.

<rant>致所有回答的人:

 this->x = x; 
Run Code Online (Sandbox Code Playgroud)

不要问我找工作.我的上帝,你正试图引起问题.
它看起来很可怕的事实并不是说这是一个坏主意.

是的,它在技术上是允许的,但重点是使代码易于阅读和维护,而不是尝试使其成为解码前一作者意图的异国艺术.

</咆哮>