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

Declaring a local variable within class scope with same name as a class attribute

本文关键字:局部变量 范围内 声明 属性      更新时间:2023-10-16

在观察另一个人的代码时,我意识到在类A的方法中,他声明了一个与类A变量同名的局部int。例如:

classA.h:

class A{
    int Data;
    void MethodA();
};

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
}

我发现编译器接受这个而不返回错误是很奇怪的。在上面的例子中,是将4分配给本地的Data还是A::Data,在更复杂的情况下,这会导致什么问题?

局部变量将遮蔽成员变量(它的作用域更窄)。如果你只写

Data = 4;

将分配给局部变量Data。您仍然可以使用

访问成员变量。
this->Data = 4;

基本上和

一样
{
int data = 4;
    {
    int data = 2;
    data++; // affects only the inner one
    }
}

对于将来的问题:只要你和所有使用你代码的人都理解这些规则,并且知道你是故意这么做的,就不会有问题。如果你不打算故意这样做,让你的编译器发出警告。

但是,如果您遵循成员变量的命名方案,例如,添加像

这样的下划线,则肯定会节省时间。
class A{
    int Data_;
    void MethodA();
};