2015-02-06 3 views
0

Как получить глобальные переменные из внутренних областей, учитывая следующий пример кода, как я могу достичь глобальной строки X из основной функции и из самой внутренней области, а также самая внутренняя область видимости доступна после того, как мы выйдем из нее в основной объем или в другую область?C++ 11- области применения и глобальные переменные

#include <iostream> 
#include <string> 
std::string x = "global"; 
int counter = 1; 

int main() 
{ 
    std::cout <<counter ++ << " " << x << std::endl; 
    std::string x = "main scope"; 
    std::cout <<counter ++ << " " << x << std::endl; 
    { 
     std::cout <<counter ++ << " " << x << std::endl; 
     std::string x = "inner scope"; 
     std::cout <<counter ++ << " " << x << std::endl; 
    } 
    std::cout <<counter++ << " " << x << std::endl; 
} 

соиЬ в настоящее время:

1 global 
2 main scope 
3 main scope 
4 inner scope 
5 main scope 
+1

Используя оператор области видимости '::', например, ':: x', который ссылается на глобальную переменную' x'. –

+0

Не используйте одно и то же имя для всех переменных. – Theolodis

+0

@ Theolodis Конечно, я просто пытаюсь понять идею областей –

ответ

4

Глобальный охват может быть достигнут с помощью ::x, в соответствии с:

#include <iostream> 
#include <string> 

std::string x = "global"; 
int counter = 1; 

int main() 
{ 
    std::cout << counter++ << " " << x << std::endl; 
    std::string x = "main scope"; 
    std::cout << " " << ::x << std::endl; 
    std::cout << counter++ << " " << x << std::endl; 
    { 
     std::cout << " " << ::x << std::endl; 
     std::cout << counter++ << " " << x << std::endl; 
     std::string x = "inner scope"; 
     std::cout << " " << ::x << std::endl; 
     std::cout << counter++ << " " << x << std::endl; 
    } 
    std::cout << " " << ::x << std::endl; 
    std::cout << counter++ << " " << x << std::endl; 
} 

, который дает вам:

1 global 
    global 
2 main scope 
    global 
3 main scope 
    global 
4 inner scope 
    global 
5 main scope 

В hard бит фактически подходит к промежуточным областям, например main scope, когда вы используете внутренний объем.

Один из способов сделать это со ссылками:

#include <iostream> 
#include <string> 

std::string x = "outer"; 

int main() 
{ 
    std::cout << "1a " << x << "\n\n"; 

    std::string x = "middle"; 
    std::cout << "2a " << ::x << '\n'; 
    std::cout << "2b " << x << "\n\n"; 

    { 
     std::string &midx = x; // make ref to middle x. 
     std::string x = "inner"; // hides middle x. 
     std::cout << "3a " << ::x << '\n'; 
     std::cout << "3b " << midx << '\n'; // get middle x via ref. 
     std::cout << "3c " << x << "\n\n"; 
    } 
} 

, которая дает:

1a outer 

2a outer 
2b middle 

3a outer 
3b middle 
3c inner 

Но, как хороший совет, вы обнаружите, что вам не придется в любом месте около столько проблем, если вы:

  • Назовите свои переменные немного более разумно, чтобы избегать столкновений; и
  • избежать глобальных переменных, как чумы :-)

И, как и для переменных во внутренних областях, они перестают быть доступны, как только вы оставить, что область применения, даже при условии ссылки (можно скопировать их к переменной с большей областью, но это не то же самое, что доступ к переменной с внутренней областью).

+0

уверен, я буду использовать разные имена для переменных, я просто пытаясь понять области. Спасибо за четкий ответ –

Смежные вопросы