【C++】关键字namespace

前言

这将是我学C++写的第一篇文章,以后将会按照我在课堂上学习的顺序进行文章更新(不能保证把每节课的内容全部写成博客),用于做知识复习和 技术分享。
其实,此前学C的时候,我一篇文章也没写过,因为太懒了。越到了后面越知道,懒是要付出代价的。课后没有将知识进行总结归纳,过个几天就全部忘个精光了,想复习都不知道从哪儿下手。还有就是看着同一水平一起开始学习的人,从学完C语言,人家差距拉了你不止一两个层次,自己已经是个吊车尾了。我也在想如何才能追赶上他们的脚步,也发现了优秀之人在学习上优点的共同之处:1)他们很善于总结,将课上知识点能进行很细致的梳理,写成文章博客。2)他们动手能力很强。课上老师讲的写的代码,他们课后都会自己再敲一遍甚至更多,做完作业还能自己去力扣和牛客网刷题。3)他们真的很努力。听完一遍课再听一遍梳理知识,课上代码敲一遍,然后写成博客,我觉得对我来说不休息的话至少也得七个小时往上,然后别人还去刷题、超前学习,也就是说别人一天大半的时间拿来学编程。而我还在认为上课能听得懂就行(现实是上课也不能完全听懂),课后动手敲代码少之又少,那差距不就是这样被人拉出来了吗。

C++关键字

C语言有32个关键字,因为C++兼容C,C++在C的基础上增加至63个关键字,差不多是C语言的两倍。

在这里插入图片描述

关键字namespace

我们写C++文件一开头总看见这两句

#include <iostream>
using namespace std;

一行是包头文件,另一行又是什么东西?我们需要认识一下命名空间的概念

命名空间

在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。例如,一个大型项目由多名程序员共同开发,会使用大量的变量和函数,不可避免地会出现变量或函数的命名重名的情况。命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。

命名空间的定义

定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中包含的即为命名空间的成员。

1. 普通的命名空间

namespace N1 // N1为命名空间的名称
{
 // 命名空间中的内容
	 int a;//可以定义变量
	 int Add(int x, int y)//也可以定义函数
	 {
	 return x + y;
	 }
}

2. 命名空间可以嵌套

namespace N1 
{
 	int a;
 	int Add(int x, int y)
	{
 	return x + y;
 	}
 	
	 namespace N2 
	{
	 	int a;
		int Add(int x, int y)
	 	{
	 		return x + y;
	 	}
	}
}

3. 命名空间名称可以相同

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

注意:定义一个命名空间相当于定义了一个新的作用域 ,命名空间中的所有内容都局限于该命名空间中,(定义的内容实际上还是全局变量,是放到静态区的(函数参数、局部变量是在栈区),限定在命名空间域里,别人在全局上是找不到的)

namespace N 
{
	 int a = 10;
	int Add(int x, int y)
	 {
	 	return x + y;
	 }
}
int main()
{
	 printf("%d\n", a); // 该语句编译出错,无法识别a
	 return 0;
}

在编译的时候,编译器去找变量a,会优先从局部域找,找不到再去全局域找(都有定义的情况下局部优先)

还要注意的一个点是,命名空间的变量不能赋值

namespace N 
{
	int a = 10;
	a = 100;//这样是编不过的
}

至于为什么,涉及的一些东西比较底层,我暂时也没弄明白

命名空间的使用

那么我们想要使用命名空间里定义的东西应该怎么用呢?

1. 加命名空间名称及作用域限定符

int main()
{
 printf("%d\n", N::a);
 return 0; 
}

2. 使用using将命名空间中成员引入

using N::a;
int main()
{
 printf("%d\n", a);
 return 0; 
}

使用 using 相当于把命名空间N里定义的变量a暴露在了全局域里

3. 使用using namespace 命名空间名称引入

using namespce N;
int main()
{
 printf("%d\n", a);
 Add(10, 20);
 return 0; 
}

这样就相当于把命名空间N整个域的内容全部暴露在全局里了,就可以当做全局的东西使用了

C++标准库中的函数或者对象都是在命名空间std中定义的,这样我们就知道 using namespace std; 到底是什么含义了。

不过一般在做大项目的时候,不建议全部展开,不安全因素会变大,一般是用什么展开什么。但一般在自己学习练习的时候不太讲究,一般全展开。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值