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

Posted

技术标签:

【中文标题】在类范围内声明一个与类属性同名的局部变量【英文标题】:Declaring a local variable within class scope with same name as a class attribute 【发布时间】:2015-05-27 22:48:09 【问题描述】:

在观察另一个人的代码时,我意识到在 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,在更复杂的情况下会导致什么问题?

【问题讨论】:

这不是错误,但可以配置为警告。 See this question. 那么,当你尝试它时,发生了什么? 【参考方案1】:

局部变量将影响成员一(它的范围更窄)。如果你只是写

Data = 4;

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

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

这基本上就像


int data = 4;
    
    int data = 2;
    data++; // affects only the inner one
    

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

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

class A
    int Data_;

    void MethodA();
;

【讨论】:

以上是关于在类范围内声明一个与类属性同名的局部变量的主要内容,如果未能解决你的问题,请参考以下文章

Java语言基础——属性和局部变量的对比

深入理解变量声明提升和函数声明提升

20165323 第三周学习总结

全局局部变量,数据的存储类别

局部变量,实例变量,静态变量

成员变量与局部变量