scope和namespace
scope就是我们常说的作用域,namespace是C++引入的一个关键字。这两种都和作用域有些微妙的联系,下面 引自Global scope vs global namespace的回答很好解释了这两个概念。
In C++, every name has its scope outside which it doesn't exist. A scope can be defined by many ways : it can be defined by namespace, functions, classes and just { }.
So a namespace, global or otherwise, defines a scope. The global namespace refers to using
::
, and the symbols defined in this namespace are said to have global scope. A symbol, by default, exists in a global namespace, unless it is defined inside a block starts with keywordnamespace
, or it is a member of a class, or a local variable of a function:int a; //this a is defined in global namespace //which means, its scope is global. It exists everywhere. namespace N { int a; //it is defined in a non-global namespace called `N` //outside N it doesn't exist. } void f() { int a; //its scope is the function itself. //outside the function, a doesn't exist. { int a; //the curly braces defines this a's scope! } } class A { int a; //its scope is the class itself. //outside A, it doesn't exist. };Also note that a name can be hidden by inner scope defined by either namespace, function, or class. So the name
a
inside namespaceN
hides the namea
in the global namspace. In the same way, the name in the function and class hides the name in the global namespace. If you face such situation, then you can use::a
to refer to the name defined in the global namespace:int a = 10; namespace N { int a = 100; void f() { int a = 1000; std::cout << a << std::endl; //prints 1000 std::cout << N::a << std::endl; //prints 100 std::cout << ::a << std::endl; //prints 10 } }