喵呜:C++基础系列来啦来啦:namespace命名空间详解

Posted 爱吃榴莲的喵星人

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了喵呜:C++基础系列来啦来啦:namespace命名空间详解相关的知识,希望对你有一定的参考价值。

文章目录


一、 C++关键字简单了解

提示:C++兼容C的绝大多数语言特性

C++总计63个关键字,C语言有32个关键字,对比简单了解一下,后续系列中,喵博主会具体介绍
C++关键字

C语言关键字


二、命名空间

1.提示

提示:1.为什么会存在命名空间?C语言中无法解决命名冲突问题,C++中我们用到namespace关键字来解决。
2.命名冲突是什么?在C/C++中,将会存在大量函数、变量、类,它们的名称将都存在于全局作用域中,可能会导致很多冲突。
栗子:(1)我们自己定义的变量、函数可能跟库里面重名冲突
在下面的图片中全局变量rand与库函数<stdlib.h>的rand函数命名冲突,导致printf函数不知道应该打印函数rand的地址值还在打印整型变量rand的值

(2)在大型项目中,多人合作,可能会出现两个人及以上,命名相同功能不同等问题的命名冲突。
3.所以命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染

2.命名空间的定义

(1)普通的命名空间

#include<stdlib.h>
#include<stdio.h>

int a = 5;
namespace chestnut 
	//rand还是全局变量,放在静态区,命名空间不影响变量本身属性
	//命名空间影响的是编译器编译的查找规则
    int rand = 0;


int main()

	int a = 10;
	//如果全局变量和局部变量名字相同打印局部变量
	printf("%d\\n", a);
	// ::域作用限定符, ::左边域是空白就指的是全局域
	//想打印全局变量的a,就加::
	printf("%d\\n", ::a);
   //打印库函数中rand函数地址
	printf("%p\\n", rand);
	printf("%d\\n", chestnut::rand);
	return 0;

代码运行结果:

(2)命名空间可以嵌套

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


(4)问题与总结

那么问题来啦,如果一个项目中写了相同命名空间,命名空间里有功能不同函数名相同的函数,会出现什么情况了?
如图:命名空间相同,show函数名也相同
图片包含两个头文件和两个源文件代表两个不同人写的代码合并在一起
此时就报错了,所有命名空间相同但是不能出现相同的函数名,即使功能相同函数名都一样也不行
那么问题又来啦,那为啥命名空间的意义在哪里?
用命名空间的地方可以说比起函数等内容的名字少,只要把命名空间的名字控制好,就能避免命名空间冲突问题。可以说以少控多

3.命名空间使用

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

就是上面栗子的方式,喵博主就简单举个栗子
learn1::add();
注意:指定作用域,做到最好命名隔离,但是他使用不方便

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


注意:用于展开命名空间中常用的

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


注意:全部展开,用起来了方便隔离就失效了(慎用)
隔离失效情况

(4)using namespace std;

早期标准库将所有功能在全局域中实现,声明在.h后缀的头文件中,使用时只需包含对应头文件即可,后来将其实现在std命名空间下,为了和C头文件区分,也为了正确使用命名空间,规定C++头文件不带.h;旧编译器(vc 6.0)中还支持<iostream.h>格式,后续编译器已不支持,因此推荐使用包含头文件以及std标准命名空间。

常用的展开


全展开
在日常练习中,为了方便直接using namespace std;使用即可。
using namespace std 展开,标准库就全暴露出来了,如果我们定义跟库重名的类型/对象/函数,就存在冲突问题。所有在项目开发中,不建议使用这种方式。

三、C++输入与输出


说明:
1.使用cout标准输出对象(控制台)和cin标准输入对象(键盘)时,必须包含头文件以及按命名空间使用方法使用std。
2.cout和cin是全局的流对象,endl是特殊的C++符号,表示换行输出,都包含在头文件中。
3.<<是流插入运算符,>>是流提取运算符。
4.使用C++输入输出更方便,不需要同printf/scanf输入输出需要手动控制格式。C++输入输出可以自动识别变量类型。
5.实际上cout和cin分别是ostream和istream类型的对象,>>和<<也涉及运算符重载等知识。

以上就是这篇文章的所有内容,后续【C++基础系列】陆续更新,文章如有错误部分,希望多和喵博主讨论,相互学习相互进步。

以上是关于喵呜:C++基础系列来啦来啦:namespace命名空间详解的主要内容,如果未能解决你的问题,请参考以下文章

喵呜,来啦来啦:你真的了解if,if else吗

喵呜 来啦来啦:C语言gets(),scanf()与getchar()函数的区别

喵呜:C++基础系列:引用

喵呜:C++基础系列:引用

喵呜:C++基础系列:引用

喵呜:C++基础系列:缺省函数函数重载