目录
在使用命名空间前,先导入using namespace std
7、无名的命名空间只能在本文件中使用(相当于static),不能在其他文件中使用,相当于内连接
4、using使用具体的命名空间中的成员有时会和局部变量产生冲突
5、using使用具体的命名空间中的成员有时不会和全局变量产生冲突
一、namesapce命名空间
在使用命名空间前,先导入using namespace std
1、命名空间的使用
变量的搜索顺序:局部域->全局域->namespace空间域 or展开的namespace域
#include<iostream>
using namespace std;
int a = 0;
namespace A {
int a = 10;
}
void test(){
int a =1;
cout<<"A::a="<<A::a<<endl;
}
int main(){
test();
}
2、命名空间只能定义在全局范围中,不能定义在局部范围中
3、命名空间嵌套使用
#include<iostream>
using namespace std;
namespace A {
int a = 10;
namespace C {
int b = 20;
}
}
void test() {
cout << "A中的a=" << A::a << endl;
cout << "C中的b=" << A::C::b << endl;
}
int main(){
test();
}
运行结果:
4、命名空间在使用过程中可以随时添加成员
5、命名空间中可以添加变量或函数
namespace A {
int a = 100;
void func() {
cout << "A::a=" << a << endl;
}
}
void test() {
cout << "A::a=" << A::a << endl;
A::func();
}
运行结果:
6、命名空间中的函数可以在命名空间外进行定义
namespace A {
int a = 100;
void func();
}
void A::func() {
cout << "A::a=" << a << endl;
}
void test() {
A::func();
}
运行结果:
7、无名的命名空间只能在本文件中使用(相当于static),不能在其他文件中使用,相当于内连接
namespace {
int b=10;
void func(){
cout<<"无用命名空间"<<endl;
}
}
void test(){
cout<<"b="<<b<<endl;
func();
}
int main(){
test();
}
运行结果:
8、命名空间取别名
namespace A {
int a = 100;
void func() {
cout << "A::a=" << a << endl;
}
}
void test() {
namespace B = A;
cout << "A::a=" << B::a << endl;
B::func();
}
运行结果:
二、using使用命名空间
1、using使用整个命名空间(展开命名空间)
namespace A {
int a = 100;
void func() {
cout << "A::a=" << a << endl;
}
}
void test() {
using namespace A;//使用A的命名空间,先从当前使用的命名空间中查找,找不到再通过其他路径查找
cout << "A::a=" << a << endl;//使用的是A中的变量
func();
}
运行结果:
2、代价:产生冲突
使用using命名空间的时候,先从当前使用的命名空间中查找,找不到再通过其他路径查找
namespace A {
int a = 100;
void func() {
cout << "A::a=" << a << endl;
}
}
void test() {
int a = 200;
using namespace A;//使用A的命名空间,先从当前使用的命名空间中查找,找不到再通过其他路径查找
cout << "A::a=" << a << endl;//使用的是当前局部变量
func();
}
运行结果:
这时候发现结果a并不是命名空间A中的值,而是局部变量a的值,这时候就会产生冲突
解决方法:
namespace A {
int a = 100;
void func() {
cout << "A::a=" << a << endl;
}
}
void test() {
int a = 200;
using namespace A;//使用A的命名空间,先从当前使用的命名空间中查找,找不到再通过其他路径查找
cout << "A::a=" << a << endl;//使用的是当前局部变量
cout << "A::a=" << A::a << endl;//使用的是A中的变量
func();
}
这时候需要使用完整的作用域才能解决此冲突
3、using使用具体的命名空间中的成员
namespace A {
int a = 100;
void func() {
cout << "A::a=" << a << endl;
}
}
void test() {
using A::a;//指明使用A中的a;
cout << "A::a=" << a << endl;
//func使用必须加作用域
A::func();
}
运行结果:
当指明使用的成员时,可以不加作用域,没有指明的成员必须加上作用域
4、using使用具体的命名空间中的成员有时会和局部变量产生冲突
namespace A {
int a = 100;
void func() {
cout << "A::a=" << a << endl;
}
}
void test() {
int a = 200;
using A::a;//指明使用A中的a;
cout << "A::a=" << a << endl;
//func使用必须加作用域
A::func();
}
运行结果:
5、using使用具体的命名空间中的成员有时不会和全局变量产生冲突
namespace A {
int a = 100;
void func() {
cout << "A::a=" << a << endl;
}
}
int a = 200;
void test() {
using A::a;//指明使用A中的a;
cout << "a=" << a << endl;//使用的是命名空间中的a;
cout << "a=" << ::a << endl;//使用的是全局变量中的a;
}
运行结果:
6、using遇到重载函数
namespace A {
void func() {
cout << "无参的func" << endl;
}
void func(int a) {
cout << "int的func" << endl;
}
void func(int a,int b) {
cout << "int int 的func" << endl;
}
}
void test() {
using A::func;//指明使用A所有中的func
func();
func(10);
func(10, 10);
}
运行结果:
7、不同命名空间中的同名成员,使用时注意二义性
namespace A {
int a = 10;
}
namespace B {
int a = 10;
}
void test() {
using namespace A;
using namespace B;
cout << "a=" << a << endl;
}
运行结果: