2017-01-25 8 views
2

Я недавно видел этот код в cppreference:C++ Уплотненный Scope Доступ

string str="global scope"; 

void main() 
{ 
    string str="main scope"; 
    if (true){ 
     string str="if scope"; 
     cout << str << endl; 
    } 
    cout << str << endl; 
} 

который выводит:

if scope 
main scope 

Это нормально, я понимаю всю вложенную области видимости вещь, и я знаю, что «str» внутри области if будет уничтожена, когда стек разматывает ее в конце инструкции, поэтому после нее она не будет доступна, поэтому вторая печать берет главную «str» в качестве аргумента.

Однако, я знаю, что главная «str» на самом деле доступна внутри IF или, по крайней мере, это должно быть, но вопрос как я могу получить доступ к главной «str» изнутри оператора IF?

И как я могу получить доступ к глобальной «str» изнутри основного и/или if?

Я знаю, что было бы проще просто использовать разные имена, но этот вопрос не для конкретного практического приложения, а для лучшего понимания областей C++.

+0

cppreference никогда не будет "недействительным главный". Это даже не компилируется. – Cubbi

+0

, который зависит от вашего компилятора – J3STER

+0

, он не будет компилироваться на cppreference.com, который использует gcc и clang. – Cubbi

ответ

4

Это проблема, скрывающая имя. И

Как я могу получить доступ к главной «str» изнутри оператора IF?

К сожалению, это невозможно. Невозможно получить доступ к этим локальным именам.

И как я могу получить доступ к глобальной «str» изнутри основного и/или if?

Для этого можно использовать scope resolution operator ::. ::str, который ссылается на имя str в глобальном масштабе.

+0

спасибо, вы на 100% уверены, что его невозможно (первый вопрос)> – J3STER

+1

@ J3STER Да, я. Невозможно получить доступ к этим локальным именам. – songyuanyao

+0

Во-вторых, локальные переменные недоступны для всего, что выходит за рамки его возможностей. Также локальные переменные уничтожаются при выходе из области видимости, поэтому я не вижу, как можно было бы получить доступ к объекту в любом случае? – PaulHK

3

Блок if не может ссылаться на переменную str, которая определена в main(), если вы не измените имя одной из переменных. Доступ к внешним переменным с тем же именем, что и внутренние переменные, невозможно.

Однако глобальные переменные можно получить с помощью оператора ::.

Хотя, работа вокруг возможно использование указателей:

string str = "global-scope"; 

void main() 
{ 
    string str = "main scope"; 
    string *ptrOfStr = &str; 
    if (true){ 
     string str = "if scope"; 
     cout << str << endl; 
     cout << "Value of str in main block : " << *ptrOfStr; 
    } 
    cout << str << endl; 
}