【C++入门必备知识:命名空间与关键字】


在这里插入图片描述

【命名空间】

在C/C++中,变量,函数和类都是大量存在的,而这些变量,函数,和类的名称都将存在全局作用域中,这样可能就回引起很多冲突:比如命名冲突。

  • 命名冲突
    1.我们跟库冲突
    2.我们互相之间冲突

而我们使用命名空间的目的就是为了解决C语言大多缺陷<命名冲突>。
使用命名空间可以对标识符的名称进行本地化,从而避免命名冲突或名字污染。

1.编译器访问域顺序 --局部域>全局域–>展开命名空间域or指令访问命名空间域。
2.命名空间展开就是展开到全局里来,是编译器是否会到命名空间域中访问搜索。

#include <stdio.h>
#include <stdlib.h>
int rand = 10;
int main()
{
 printf("%d\n", rand);
return 0;
}
//比如我们在这里定义一个全局变量rand,想要打印rand。
//但是编译器会报错,因为显示重定义。
为什么呢?因为引用了头文件后,头文件里就有rand函数的定义,在头文件里rand定义为函数,而在这里又被定义为全局变量,所以产生了命名冲突。

由于在C语言中该类问题无法解决,所以在C++中提出了使用namespace来解决

①.命名空间定义

库里的名称我们无法改变,那我们可以将自己定义的名称放在命名空间里,当需要时指令访问即可。
那怎么定义命名空间呢?

定义命名空间,需要使用关键字namespace,后面跟着命名空间名子,然后再接着一个{}即可。
{}里即为命名空间的成员,可以是变量,函数,类。

namespace定义的命名空间就相当于定义一个域–可以与其他域隔离。也就是将自己定义的变量,函数,类,划到一个新的域中,让全局域找不到自己。

常见域:
1.类域
2.命名空间域
3.局部域
4.全局域

Ⅰ.正常定义命名空间
namespace wei
{
	int a = 10;//可以定义变量
	
	int Add(int x, int y)//可以定义函数
	{
		return x + y;
	}

	struct Node//可以定义类
	{
		int data;
		struct Node* next;
	};
}
Ⅱ.嵌套定义命名空间

命名空间是可以嵌套的
比如C++库名字就叫std里面就嵌套着许多命名空间。

namespace tao1
{
	int a = 10;
	int b = 20;
	namespace tao2
	{
		int a = 1;
		int b = 2;
		namespace tao3
		{
			int a = 3;
			int b = 4;
		}
	}
}
Ⅲ.合并命名空间

在不同的头文件里,最后同名的命名空间会合并成一个。

也就是在同一个工程中允许多个相同名称的命名空间,编译器最后会合成同一个命名空间中的

在这里插入图片描述

//test.cpp文件
namespace tao1
{
	int a = 10;
	int b = 20;
	namespace tao2
	{
		int a = 1;
		int b = 2;
		namespace tao3
		{
			int a = 3;
			int b = 4;
		}
	}
}
//test.h文件
namespace tao1
{
	int max;
	int min;
	int a = 10;
	int b=30;
}

②.命名空间的使用

定义好命名空间后,我们可以在命名空间里定义我们想要定义的变量,函数,类,并且不需要担心和库里函数发生命名冲突。
不过当我们要使用这些命名空间里的成员时,该如何使用呢?

::域作用限定符

Ⅰ.+命名空间名称及域作用限定符
namespace wei
{
	int a = 10;//可以定义变量
	
	int Add(int x, int y)//可以定义函数
	{
		return x + y;
	}

	struct Node//可以定义类
	{
		int data;
		struct Node* next;
	};
}
int main()
{
	printf("%d", wei::a);//加命名空间名称与域作用限定符
	return 0;
}

Ⅱ.using成员引入
namespace wei
{
	int a = 10;//可以定义变量
	
	int Add(int x, int y)//可以定义函数
	{
		return x + y;
	}

	struct Node//可以定义类
	{
		int data;
		struct Node* next;
	};
}
using wei::Add;//使用using将命名空间中某个成员引入。
int main()
{
	printf("%d\n", wei::a);
	printf("%d\n", Add(2, 5));
	return 0;
}

Ⅲ.using namespace名称全部引入
namespace wei
{
	int a = 10;//可以定义变量
	
	int Add(int x, int y)//可以定义函数
	{
		return x + y;
	}

	struct Node//可以定义类
	{
		int data;
		struct Node* next;
	};
}

using namespace wei;//使用using namespace命名空间名称将命名空间内容全部展开。
int main()
{
	printf("%d\n", wei::a);
	printf("%d\n", Add(2, 5));
	struct Node n;
	return 0;
}

但这种做法是有风险的。

③.注意事项

当我们使用第三种方法来访问命名空间里的成员时,会存在风险,因为命名空间全部展开到全局域中,就又会出现命名冲突的风险。比如如果全部展开C++标准库就会存在风险。

  • using namespace std;
    1.直接展开会有风险:当我们定义如果和库重名那就会报错
    2.建议项目里面不要直接展开,建议日常练习可以直接展开
    3.项目中建议指定展开,不要轻易展开命名空间。

不过我们还可以这样:

如果有重复多使用的可以【部分展开】:【指定展开】:【把常用的展开】

using std::cout;//将常用的成员展开使用
using std::end1;//将常用的成员展开使用

【C++关键字(C++98)】

C++关键字总计为63个,C语言总计32个关键字。

在这里插入图片描述

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小陶来咯

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

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

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

打赏作者

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

抵扣说明:

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

余额充值