C++学习——命名空间

命名空间是C++为解决全局作用域中的变量和函数名冲突而引入的机制。它允许程序员将代码组织在不同的命名空间内,防止命名重复导致的错误。通过使用命名空间,可以避免在大型项目中不同程序员定义相同名称的结构体或变量时的冲突。命名空间的使用方式包括直接使用作用域限定符、使用`using`引入单个成员以及`usingnamespace`引入整个命名空间,但后者可能引发不必要的命名冲突。
摘要由CSDN通过智能技术生成

首先要知道什么是命名空间,命名空间被创建的目的是什么,命名空间可以解决哪一类问题,带着这三个疑惑去理解命名空间,学懂命名空间。

在C/C++中,变量、函数是大量存在的,这些变量、函数的名称将都存在于全局作用域中,因此可能会导致很多冲突,为了解决此问题,C++引入命名空间的概念,对标识符的名称进行本地化,以避免命名冲突或名字污染。

举个例子,如果两个程序员合作完成一个项目,两人创建的结构体均命名为LIST,当两者程序合并时,系统会显示重复定义错误,这时该如何解决问题呢?难道只能修改结构体名称吗?要知道这时一项很繁杂的工作。为了避免此类事情的发生,C++准备了两个控件,分别装载了两个程序员的代码,使其分隔开,互不干扰。

typedef struct Node//程序员A的代码
{
	struct Node* a;
	int cor;
	char x;
}Node;

typedef struct Node//程序员B的代码
{
	struct Node* a;
	int cor;
}Node;
//以上均包含在不同的头文件中

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

例如上述情况,存在重复定义的情况,
此时编译器会报错:error C2011: “Node”:“struct”类型重定义。这里就可以使用命名空间来解决,如下:

#include"test1.h"
#include"test2.h"
#include<iostream>
using namespace std;
namespace A
{

	int a = 10, b = 1;
	typedef struct Node//程序员A的代码
	{
		struct Node* a;
		int cor;
		char x;
	}Node;
}

namespace B
{
	int a = 20, b = 2;

	typedef struct Node//程序员B的代码
	{
		struct Node* a;
		int cor;
	}Node;
}

int main()
{
	int x = A::a;
	int y = B::a;
	cout << x << endl;
	cout << y << endl;
	return 0;
}

运行结果如下:
在这里插入图片描述
命名空间的使用方式有三种:

  1. 加命名空间名称及作用域限定符
    在使用时加入限定符,准确定位到想用的成员,但缺点是看起来显得较为冗余,每一次使用都需要调用,使整体代码显得很繁杂。
int main()
{
	printf("%d\n",A::a);
	return 0;
}
  1. 使用using将命名空间中某个成员引入
    事先将常用的成员变量引入,避免后面的多次引用,此方法最为常用,并且使用也很方便。
using A::a;
int main()
{
	printf("%d\n",A::a);
	printf("%d\n",b);
	return 0;
}
  1. 使用using namespace 命名空间名称引入
    直接将命名空间内的所有成员变量均引入,但是有部分弊端,例如我们在使用原始库的时候,所有的成员变量都引入了,在我们写自定义函数的时候会无意的与库里面的函数重复定义了,有时会造成不必要的麻烦,一般不使用这种方法,除了对于自己定义的命名空间并且过程量较小的时候。
using namespace A;
int main()
{
	printf("%d\n",A::a);
	printf("%d\n",b);
	return 0;
}

总结:
命名空间是C++为了弥补一些C语言的缺陷而创建的,应用范围还是比较广的,之后也会有很多只是综合用法,还是值得去探究的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值