一、为什么要使用命名空间
命名空间的功能就是区分不同的代码段,避免使用不同代码时带来变量名冲突的问题。
在写C语言代码时,常常回面临命名冲突的问题。例如:
可以成功运行。
但是如果要使用 time.h 头文件时,就会与库发生冲突
还有在包其他同学写的头文件时,也有会发生命名冲突的可能。
为了解决这一问题,C++引入了命名空间,把自己写的代码放进命名空间中,就能解决这一问题。
我们可以看到,上面显示重定义的错误在给我们自己定义的变量加上命名空间后就消失了
程序运行后就打印出来了clock这个函数指针的值
1、其中,namespace 就是定义命名空间的关键字,后面跟着你的命名空间的名字,再用大括号括起来,大括号里面就是你的命名空间了。
2、命名空间就像是一堵无形的墙,把里面的代码和外面的隔开了,所以编译器只能找到库里面的clock。
3、要注意的是,命名空间不能和别人或者库里的发生冲突,不然也会报错的。如下:
二、域作用限定符
1、那我们命名空间里的变量在外面如何使用呢?
就是用域作用限定符 :: (两个冒号)
命名空间名字::变量名 就可以使用了。
2、如果命名空间里面还有一个命名空间怎么使用最里面的命名空间?
命名空间是可以嵌套的,
使用里面命名空间的方法就是 外命名空间名字::里命名空间名字::变量名。
三、同名空间会合并
在同一个文件或不同文件中定义的同名命名空间会合并。
我们在写代码时,经常要写一个头文件,一个.c 或.cpp 文件。
此时可以在头文件和.c 或.cpp 文件中定义一个同名命名空间,这样就可以声明与定义分离。
四、展开命名空间(慎)
相信大家在写 cpp 代码时经常会写 using namespace std;
这句话的意思就是展开命名空间std
展开命名空间就是把命名空间里的代码全部暴露出来,本来变量只在全局变量中找,展开命名空间后也会去命名空间里面查找。
展开命名空间的方法就是用using namespace 命名空间名字 来展开命名空间
1、展开命名空间后可以指定也可以不指定,指定命名空间后就会只会去指定的空间查找
不指定命名空间就会在全局以及展开的命名空间中查找。
2、可以展开多个命名空间
3、不推荐在写项目时展开命名空间,因为我们使用命名空间就是为了封装起来,现在又展开显得多此一举,而且展开命名空间很有可能会在使用时发生冲突,如上。
五、指定展开
展开命名空间会有风险,而一直用域作用限定符又很累,此时就可以使用我们的指定展开
如:当我们再写常用的如:cout 、cin、endl等等时,一直写std::cout, std::cout....很不方便时
就可以采用指定展开,用法:using 命名空间名字::变量名;
例如:using std::cout;
此时会报错
指定展开后,成功运行
推荐使用指定展开,这样既可以避免风险,也能让我们更轻松。
感谢大家观看!