资讯专栏INFORMATION COLUMN

[C++基础] 命名空间namespace的了解和使用

RiverLi / 3240人阅读

摘要:提出了一个新语法命名空间命名空间的定义对于上面的问题我们使用命名空间来解决我们使用来划定一个区域,叫做域,域的名字叫名字可以自己定义,但是最好不要跟库已有的重复。

命名空间 namespace

#includeint rand = 0;int main(){	printf("%d", rand);		return 0;}

上述代码一定会出现以下情况:

原因: 自己定义的rand变量为某一库函数里面已经声明过的函数,意思就是你自己定义的东西跟库函数的东西重复了。这种错误就是命名冲突

命名冲突问题:

  1. 我们自己定义的变量、函数可能跟库里面重名冲突。
  2. 进入公司项目组后,做的项目通常比较大,多人协作,可能命名冲突。
    C语言没有办法很好的解决这个问题。
    C++提出了一个新语法:命名空间

命名空间的定义

对于上面的问题我们使用命名空间来解决:

#includenamespace zzy{	int rand = 0;}int main(){	printf("%d", zzy::rand);		return 0;}

我们使用namespace来划定一个区域,叫做,域的名字叫zzy(名字可以自己定义,但是最好不要跟库已有的重复)。这个域就像是隐身衣一样,让系统编译的时候不会去这个区域里面读取。

:: 为域作用限定符,前面是命名空间的名称,后面是命名空间里的变量、类型、函数等。使用这个限定符来指定我们使用的是哪个命名空间里的变量

需要注意的一点是,命名空间是全局的,必须要写在main函数的外边。

下面举些例子来帮大家更清晰的了解命名空间:
1. 函数定义在命名空间里

#includenamespace zzy{	int Add(int x, int y)	{		return x + y;	}}int main(){	printf("%d/n", zzy::Add(1, 2));	return 0;}

如果把函数的定义写在命名空间的外面,而函数声明在命名空间里面会怎么样?由于命名空间会屏蔽掉,相当于你没有写这个声明。但是如果你的函数定义写在main函数的上面就没什么问题了。

#includenamespace zzy{	int Add(int x, int y);}int Add(int x,int y){	return x+y;}int main(){	printf("%d/n",/*zzy::*/Add(1, 2));	return 0;}

一点要注意,这个时候你不可以写zzy::了,因为如果你这么写的话系统会优先去zzy命名空间里去寻找,发现只有函数的声明,没有函数的定义,所以是没结果的。

2.对全局变量使用命名空间

#include int a = 0;int main(){	int a = 10;	printf("%d",::a);//使用全局作用域的a,::前面的没有东西代表全局作用域}

3.命名空间的嵌套

#include namespace zzy{	int a = 10;	namespace N1	{		int b = 20;	}}int main(){	printf("%d/n",zzy::a);	printf("%d/n",zzy::N1::b);}

4.using命名空间
我们发现,每次使用一些命名空间里的变量总是要加上”命名空间名称::”,当变量多时,就会显得很繁琐。所以我们可以这么做:

#include using namespace zzy{	int count = 12;	int Add(int x,int y)	{		return x+y;	}}//解放了整个zzy空间,使里面的变量等变得不隐身了using namespace zzy;int main(){	printf("%d",count);	printf("%d",Add(1,2));}

也可以解放一部分变量、函数等:

#include using namespace zzy{	int count = 12;	void B()	{		int cur = 0;	}}//只解放了一部分变量using zzy::B::cur;int main(){	printf("%d",zzy::count);	printf("%d",cur);}

5.命名空间里的结构体

#include using namespace zzy{	int count = 0;	struct Node	{		int val = 0;	};}int main(){	struct zzy::Node node;//注意::的位置,我们要找的是Node	node.val = 12;	printf("%d/n", node.val);}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/125069.html

相关文章

  • 关于C++基础一些“碎碎念”

    摘要:使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,关键字的出现就是针对这种问题的。缺省参数概念缺省参数是声明或定义函数时为函数的参数指定一个默认值。 ...

    Jackwoo 评论0 收藏0
  • 关于c++namespace,你真了解吗?真会用吗?

    摘要:据我了解,很多学校在学习的时候,老师会让学生死记一条语句,那就是那么你真的了解它吗命名空间是一个命名空间。如果我们真的想使用的话,的命名空间遍给了我们解决方法使用命名空间。 据我了解,很多学校在学习c++的时候,老师会让学生死记一条语句,那就是 using namespace std; 那么...

    Lionad-Morotar 评论0 收藏0
  • C++初阶】 关键字,命名空间,缺省参数,IO函数重载

    摘要:事实上语言当中有的内容,比如函数循环结构体宏等等内容,也都有,所以大家千万不要认为语言白学了哈因为之前已经完整更新过语言的博客有需要可以往前翻,所以这里直接介绍相对语言当中新增的内容,而本章引入的内容是的关键字命名空间缺省参数函数重载。 ...

    winterdawn 评论0 收藏0
  • C++从0到1之命名空间

    摘要:从到之命名空间入门命名空间命名空间定义命名空间的使用输入输出入门命名空间在中,变量函数和后面要学到的类都是大量存在的,这些变量函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。 ...

    fsmStudy 评论0 收藏0
  • C++入门—namespace使用傻傻分不清楚&C++中函数参数也可以配备胎&a

    摘要:使用输入输出更方便,不需增加数据格式控制,比如整形,字符等缺省参数备胎缺省参数是声明或定义函数时为函数的参数指定一个默认值。此外,函数重载要求参数不同,而跟返回值没关系。 ...

    pingan8787 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<