在类范围内声明一个与类属性同名的局部变量

Edi*_*iac 1 c++ variables attributes class local

在观察另一个人的代码时,我意识到在A类的方法中,他声明了一个与A类属性同名的本地int.例如:

//classA.h

class A{
    int Data;

    void MethodA();
};
Run Code Online (Sandbox Code Playgroud)

//classA.cpp

#include "classA.h"

using namespace std;

void A::MethodA(){
    int Data; //local variable has same name as class attribute

    Data = 4;

    //Rest of Code
}
Run Code Online (Sandbox Code Playgroud)

我发现很奇怪编译器会在不返回错误的情况下接受它.在上述情况下,是否将4分配给本地数据或A :: Data,以及在更复杂的情况下会导致哪些问题?

Bau*_*gen 5

局部变量将遮蔽成员1(它具有更窄的范围).如果你只是写

Data = 4;
Run Code Online (Sandbox Code Playgroud)

您将分配给本地变量Data.您仍然可以使用访问成员变量

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

这基本上就像

{
int data = 4;
    {
    int data = 2;
    data++; // affects only the inner one
    }
}
Run Code Online (Sandbox Code Playgroud)

至于未来的问题:只要您和将来使用您的代码的每个人都理解规则并且意识到您故意这样做就没有问题.如果您不打算故意这样做,请让编译器对此发出警告.

但是,如果您遵循成员变量的命名方案,例如附加下划线,那肯定会更安心

class A{
    int Data_;

    void MethodA();
};
Run Code Online (Sandbox Code Playgroud)