如果C ++类成员函数访问一个变量名,该变量名重载了作为类的成员变量和成员函数定义的全局范围中的变量的定义,成员函数实际访问哪一个?场景是这样的:
SomeClass.h:
class SomeClass
{
int Num;
void OperateOnNum();
};
SomeClass.cpp:
#include "SomeClass.h"
int Num;
void SomeClass::OperateOnNum()
{
Num = 0;
}
哪个Num将OperateOnNum进行操作? Microsoft Visual Studio 2013和GCC(版本:gcc(Ubuntu 4.8.2-19ubuntu1)4.8.2)都不会发出警告。
答案 0 :(得分:2)
类变量会影响全局变量。如果要访问全局变量,请执行以下操作:
void SomeClass::OperateOnNum()
{
::Num = 0;
}
没有任何警告,因为这就是语言的运作方式。
答案 1 :(得分:0)
在这种情况下,类成员参数阴影全局变量。因此,您可以在方法的范围内看到它。
答案 2 :(得分:0)
您始终可以使用this
和全局范围解析来消除两者之间的歧义
this->Num; // refers to the member Num
::Num; // refers to the global Num
一个好的设计,不应该诉诸这样的方法。您可以相应地标记成员名称和全局变量(这些都是“不要”):
_name; // member name prefixed with _
m_name; // member name prefixed with m_
global_name; // global name - prefixed with global_