C++命名空间详解

本文详细介绍了C++编程中命名空间的使用、命名空间嵌套、成员访问、using关键字的全名和别名引用,以及如何处理命名空间中的冲突和二义性问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一、namesapce命名空间

在使用命名空间前,先导入using namespace std

1、命名空间的使用

 2、命名空间只能定义在全局范围中,不能定义在局部范围中

 ​编辑

3、命名空间嵌套使用

4、命名空间在使用过程中可以随时添加成员 

5、命名空间中可以添加变量或函数

 6、命名空间中的函数可以在命名空间外进行定义

 7、无名的命名空间只能在本文件中使用(相当于static),不能在其他文件中使用,相当于内连接

8、命名空间取别名

二、using使用命名空间 

1、using使用整个命名空间

2、代价:产生冲突

3、using使用具体的命名空间中的成员

4、using使用具体的命名空间中的成员有时会和局部变量产生冲突

5、using使用具体的命名空间中的成员有时不会和全局变量产生冲突

 6、using遇到重载函数

7、不同命名空间中的同名成员,使用时注意二义性 


一、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;
}

运行结果:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晚笛诶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值