Глобальный охват может быть достигнут с помощью ::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
Но, как хороший совет, вы обнаружите, что вам не придется в любом месте около столько проблем, если вы:
- Назовите свои переменные немного более разумно, чтобы избегать столкновений; и
- избежать глобальных переменных, как чумы :-)
И, как и для переменных во внутренних областях, они перестают быть доступны, как только вы оставить, что область применения, даже при условии ссылки (можно скопировать их к переменной с большей областью, но это не то же самое, что доступ к переменной с внутренней областью).
Используя оператор области видимости '::', например, ':: x', который ссылается на глобальную переменную' x'. –
Не используйте одно и то же имя для всех переменных. – Theolodis
@ Theolodis Конечно, я просто пытаюсь понять идею областей –