C++命名空间

命名空间
在C/C++中,变量、函数和后面要了解的类应用及其广泛,这些变量, 函数和类的名称都将存在于全局作用域当中,可能会导致很多冲突。使用命名空间的目的就是为了对标识符的名称进行本地化,以避免命名冲突
在这里 namespace关键字的出现就是为了针对这种问题的。

关于命名空间的定义
定义命名空间,需要用到的就是namespace关键字,后面跟命名空间的名字,然后加上{}即可,在{}中的的即为命名空间的成员。
接下来我们来看具体的例子

首先来看一个普通的命名空间

namespace n1	//n1即为命名空间的名称
{
	//在命名空间中,我们既可以定义变量,也可以定义函数
	int a;
	int Add(int left, int right)
	{
		return left + right;
	}
}

为了更好地理解命名空间,我们对命名空间的常用功能进行归纳,并进行示例
1.命名空间可以解决函数, 全局变量名重复的问题,包在不同的命名空间中的重复函数实际上就是两个完全无关的函数
比如:

namespace n1	
{
	int a;
	int Add(int a, int b)
	{
		std::cout << "1" << endl;
		return a + b;
	}
}

namespace n2
{
	int Add(int a, int b)
	{
		std::cout << "2" << endl;
		return a + b;
	}
}

在C语言当中这样两个相同的函数是不可能存在的,但在C++当中命名空间的出现解决了这样的问题

在调用的时候,就要在函数前加上相对应的域;

这样我们就可以分别调用这两个相同的函数Add

int main()
{
	std::cout << n1::Add(3, 5) << endl;
	std::cout << n2::Add(2, 4) << endl;
	
	system("pause");
	return 0;
}

2.命名空间允许嵌套,嵌套内部和外部没有任何关系

看例子

namespace test
{
	namespace n1
	{
		int Add(int a, int b)
		{
				std::cout << "1" << endl;
				return a + b;
		  }
	}
	namespace n2
	{
		int Add(int a, int b)
		{
			std::cout << "2" << endl;
			return a + b;
		}
	}
}

int main()
{
	std::cout << test::n1::Add(1, 2) << endl;
	std::cout << test::n2::Add(3, 4) << endl;
	system("pause");
	return 0;
}

3.命名空间允许重名, 重名的命名空间会被合并

namespace n1{
	int sub(int a, int b){
		std::cout << "3\n";
		return a - b;
	}
}

namespace n1{
	int add(int a, int b){
		std::cout << "2\n";
		return a + b;
	}
}

命名空间是用来定义作用域的,它解决了C语言当中只能用文件划分作用域的缺陷.

使用using关键字,可以引用一个名字空间,使得这个名字空间内的所有内容对自己可见。
举个简单例子

namespace test1
{
	int a = 5;
}
int main()
{
	std::cout << a;	//这样会报错,a是未声明的标识符
	system("pause");
	return 0;
}

对其进行修改

namespace test1
{
	int a = 5;
}
using namespace test1;
int main()
{
	std::cout << a;	
	system("pause");
	return 0;
}

最后,
如果两个名字空间里分别有相同的两个函数,那么即使我同时用using引用了两个名字空间,那么也不会报错,除非我使用了这个函数(因为使用函数会产生歧义,也就是不知道该调哪个)。
也就是说

namespace n1
{
	int add(int a, int b)
	{
		return a + b;
	}
}
namespace n2
{
	int add(int a, int b)
	{
		return a + b;
	}
}
using namespace n1;
using namespace n2;

int main()
{
	
	system("pause");
	return 0;
}

这个时候不会出现问题,但是当我们要调用这个相同的函数时就会出现问题,因为编译器不知道该调哪个,即

	namespace n1
	{
		int add(int a, int b)
		{
			return a + b;
		}
	}
	namespace n2
	{
		int add(int a, int b)
		{
			return a + b;
		}
	}
	using namespace n1;
	using namespace n2;
	
	int main()
	{
		std::cout << add(3, 4);
		system("pause");
		return 0;
	}

这个时候我们调用了add函数就会报错

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值