2014-12-17 6 views
0

Если функция члена класса C++ обращается к имени переменной, которое перегружено с помощью определений как в качестве переменной-члена класса, так и переменной в глобальной области определения функции-члена, которая будет фактически функцией-членом доступ? Сценарий таков:C++ shadowing variable name

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) выдает предупреждение.

+3

FYI, который затеняет не перегружает. Перегрузка имеет несколько функций с тем же именем, но с разными параметрами. – Borgleader

+0

Тот, который находится в ближайшей области, то есть член. – molbdnilo

+0

Перегрузка - http://www.tutorialspoint.com/cplusplus/cpp_overloading.htm –

ответ

0

В этом случае параметр класса класса shadows глобальная переменная. Таким образом, вы видите это в рамках метода.

2

Переменная класса изменяет глобальную переменную. Если вы хотите получить доступ к глобальной переменной, выполните следующие действия:

void SomeClass::OperateOnNum() 
{ 
    ::Num = 0; 
} 

Предупреждений нет, потому что это как раз то, как работает язык.

0

Вы всегда можете использовать this и глобальной области видимости для dissambiguate между двумя

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_