三、名字空间(namespace)
1、名字空间的作用
1)避免名字冲突
2)划分逻辑单元
2、定义名字空间
namespace 名字空间{
名字空间的成员1;
名字空间的成员2;
名字空间的成员3;
……
名字空间的成员n;
}
注:名字空间成员可以是变量、函数、类型、名字空间
eg:
namespace ns1{
int num = 100;
void func(void){//……}
struct student{};
namespace ns2{};
}
3、名字空间成员的使用
1)通过作用域限定操作“::”
空间成员::要访问的成员
eg:
int main(void){
//空间成员不能直接访问
cout << num << endl;//error
//通过"::"访问空间里面的成员
cout << ns1::num << endl;//ok
}
02namespace.cpp
#include <iostream>
namespace ns1{
void func(void){
std::cout << "ns1的func函数" << std::endl;
}
}
int main(void){
//func();发生错误
ns1::func();
return 0;
}
2)名字空间指令
using namespace 名字空间名;
在该条指令以后的代码中,指定名字空间中的成员都可见,可以直接访问,省略"空间名::"
eg:
int main(void){
using namespace ns1;//名字空间指令
cout << num << end1;//ok
}
注:这种方法要谨慎使用,小心不同名字空间中有相同的成员名,容易引发歧义。
常用场景:using namespace std;
以后在使用标准名字空间按里面的成员省略"std::"
#include <iostream>
using namespace std;//标准名字空间指令
int main(void){
cout <<"hello world!"<<endl;
return 0;
}
3)名字空间声明
using 名字空间名::名字空间成员;
将名字空间中特定的一个成员引入当前作用域,在该作用域访问这个成员就如同访问局部的成员一样,可以直接访问,省略"空间名::"
eg:
using namespace std;
int main(void){
using ns1::num;//名字空间声明
cout << num << endl;//ok
}
4、无名名字空间
不属于任何名字空间的标识符,将被编译器之后放入无名名字空间中,无名名字空间里面的成员正常可以直接访问,但是当无名名字空间的成员和局部的标识符名字一样时局部优先,这时如果还希望访问无名名字空间的成员,可以使用作用域限制操作。
符:"::要访问的成员"
综合例子:
#include <iostream>
using namespace std;
namespace ns1{
num = 100;
void func(void){
cout << "This is ns1's function." << endl;
}
}
namespace ns2{
num = 200;
void func(void){
cout << "This is ns2's function." << endl;
}
}
//普通全局变量,将被放入无名的名字空间中
int num = 300;
void main(void){
cout << num << endl;//300
using ns1::num;//名字空间声明
cout << num << endl;//100,体现局部优先原则
cout << ns2::num << endl;//200
cout << ::num <<endl;//300
return 0;
}
5、名字空间嵌套//了解
eg:
#include <iostream>
using namespace std;
namespace ns1{
int num = 100;
namespace ns2{
int num = 200;
namespace ns3{
int num = 300;
}
}
}
int main(void){
cout << ns1::num << endl;//100
cout << ns1::ns2::num << endl;//200
cout << ns1::ns2::num3::num << endl;//300
return 0;
}