名字空间:
名字空间有两个特征:1. 顺序 2.嵌套
顺序:编译器和解释器相当于一个翻译官,拿着本子一行一行读代码,只有见过的名字才会记到本子上,每见过的名字他就不认识(所以C++需要声明 ,python需要导入)。
嵌套:当翻译官进入一个新的名字空间时(花括号体),翻译官会在记这些名字时会用花括号体的名字加上标识。
当需要使用一个名字时,翻译官会从小本子的最后向前找,若找到就不继续找了,因此内部变量会对外部变量进行隐藏,例如下图F1内使用girl的名字时是使用自己声明的对象。
若在当前名字空间时找不到就向前去父亲空间找,同样以F1为例可以用girl这个名字访问父亲N2中声明的girl对象。
- 顺序体现了时间性:只有记在本子上的名字才能使用。
- 嵌套体现了结构性:
- 处于同一个嵌套体系内部的空间可以不加空间名约束的使用父亲空间里的名字。
- 处于不同嵌套体系的可以通过名字空间约束来访问其它名字空间中的名字。
全局性质名字空间内的名字会一直记载翻译官的本子上,可以在任何地方通过名字空间约束去访问(因此类名,命名空间名等不能相同,因为需要用它来表示名字)。
局部性质名字空间内的名字会在离开名字空间体(花括号体)时被划掉,无法在其他地方使用这些名字。
名字空间是c++特有的,在c的时候没有,目的是为了防止三方库的名字冲突。有如下特征
1.命名空间将全局作用域分成不同的部分, |
2.不同命名空间中的标识符可以同名而不会发生冲突 |
3.命名空间可以发生嵌套 |
4.全局作用域也叫默认命名空间,使用::表示 |
C++命名空间的使用:
使用整个命名空间:using namespace name; |
使用命名空间中的变量:using name::variable |
使用默认命名空间中的变量: ::variable |
using namespace指令避免使用名称空间前置。该指令告诉编译器后续代码正在使用指定命名空间中的名称,一般的时候是默认不用的,因为会导致名字冲突
使用示例:
命名空间的定义
namespace A {
int a = 100;
}
void test02()
{
cout<<"A中a = "<<A::a<<endl;//100
}
命名空间只能在全局范围内进行定义,也就是函数外,类内不可定义,类内本身就是一个命名空间
命名空间可以嵌套
namespace A {
int a = 1000;
namespace B {
int a = 2000;
}
}
void test03()
{
cout<<"A中的a = "<<A::a<<endl; //1000
cout<<"B中的a = "<<A::B::a<<endl; //2000
}
命名空间是开放的,可以随时加入新的
namespace A {
int a = 100;
int b = 200;
}
//将c添加到已有的命名空间A中
namespace A {
int c = 300;
}
void test04()
{
cout<<"A中a = "<<A::a<<endl;//100
cout<<"A中c = "<<A::c<<endl;//200
}
命名空间可以存放变量和函数
命名空间内的函数可以只进行声明,在命名空间外进行定义
无名的命名空间只能在本文件中使用,相当于加了static
namespace{
int a = 10;
void func(){
cout<<"hello namespace"<<endl;
}
}
void test(){
//只能在当前源文件直接访问a 或 func
cout<<"a = "<<a<<endl;
func();
}
命名空间可以起别名
namespace veryLongName{
int a = 10;
void func(){ cout << "hello namespace" << endl; }
}
void test(){
namespace shortName = veryLongName;
cout << "veryLongName::a : " << shortName::a << endl;
veryLongName::func();
shortName::func();
}
参考:
(85条消息) 【C++】命名空间(namespace)详解_GeekBuilding的博客-CSDN博客_namespace
详解c++的命名空间namespace - 知乎 (zhihu.com)
标签:嵌套,int,namespace,c++,命名,名字,空间 From: https://www.cnblogs.com/uestc-du/p/17063216.html