🎁个人主页:我们的五年
🔍系列专栏:C++课程学习
🎉欢迎大家点赞👍评论📝收藏⭐文章
目录
📷1.命名冲突
📷2.重定义
📷3.命名空间
🍺命名空间可以嵌套:
🍺可以定义一样名字的命名空间
🍺命名空间的两种展开方式:
前言:
已经学了几天的C++,现在来把知识点梳理一下。C++和C语言差别很大,在很多方面比C语言做的更好,所以我再次感谢C++之父本贾尼博士。然后今天现来看看他在C语言上改善的一个小点。
📷1.命名冲突
本贾尼博士在用C语言的时候,可能就遇到这样的问题。他与几个同事一起写一个大型的程序,然后他们把这大型的程序分成几个部分,每个人完成一部分,然后再把代码放在一起,进行运行。结果就报错了,这里面可能有一点就是他们几个人都定义了一样的变量,这样编译器就找不到要用哪个变量。或者定义了很多函数,但是有两个人的函数名字是一样的,这样又会发生错误。所以他们就只能去改名字。这样其实也是很麻烦的,所以本贾尼博士就在C++中引入了一个新的概念:命名空间。
📷2.重定义
正常去查找变量的顺序是:
1.先在所在的局部域进行查找。
2.在全局域进行查找。
注意:在没有展开指定域的情况下,是不去该域查找的。
理解:
1.打印rand的时候,先在局部域中查找rand,然后就找到了,就输出100,这没问题。
2.打印rand的时候,在局部域找了一下,没有找到,然后又去局部域找,然后也找到了,这也没问题。
3.引入rand函数的头文件:include<stdlib.h>以后,把rand放在局部,然后运行没什么问题,还是能找到,也没有重定义。
4.当引入rand函数的头文件,全局域本来就有一个rand函数,然后又把rand变量定义在全局。这样编译器就不知道找哪个了。
🌹🌹🌹下面的这个代码也就证明了,没有其他操作情况下,编译器是不会去命名空间里找的。
要想让编译器去命名空间里找,这里有两种方法:
1.在a前面加上所在的命名空间。
2.展开a所在的命名空间。using namespace 命名空间名;
我刚刚在试的时候,就把using namespace ku;放在了命名空间的前面,就编不过去,害我找了几分钟,才知道的要把using namespace ku;放在命名空间的前面。所以老铁们,注意一下。
📷3.命名空间
从上面的例子我就已经看到命名空间了:
#include<iostream>
//ku是命名空间的名字
namespace ku {
int a = 100;
}
int main()
{
//前面的是在std域中找cont
//后面的是在ku域中找a
std::cout << ku::a ;
return 0;
}
🍺命名空间可以嵌套:
查找的时候就去一个一个域中找,如下:
展开命名空间如下:
using namespace A::B;
#include<iostream>
//A命名空间里嵌套有B命名空间
namespace A {
namespace B {
int k = 0;
}
}
int main()
{
//A::B::k查找k的结构
std::cout << A::B::k ;
return 0;
}
🍺可以定义一样名字的命名空间
当定义同样的命名空间,编译器会把名字一样的命名空间进行合并。
#include<iostream>
//编译器会合并这两个命名空间
namespace A {
int p = 88;
}
namespace A {
int a=99;
}
using namespace A;
int main()
{
std::cout << A::a << " " << A::p<<std::endl;
return 0;
}
🍺命名空间的两种展开方式:
1.全展开:
using namespace std;就是展开std命名空间里的所以东西,包括cout,cin,endl2.部分展开:
using std::cout;就是只展开std里面的cout。
注意:全展开会有很多命名已经存在,不太适合用在项目里面,在平时练习的时候还是可以用的。
#include<iostream>
using namespace std;
int main()
{
cout << "Hello World" << endl;
return 0;
}
#include<iostream>
using std::cout;//只展开std里面的cout
int main()
{
cout << "Hello World";
return 0;
}
注意点:
1.有了命名空间,就算有很多个重复的变量名,函数名,都是没关系的,只要这些在不同的域中间。所以我们写项目的时候,每个人都定义一个自己的命名空间,这样就不会出现命名重复的问题了。
2.命名空间的定义是全局的。
3.域解析操作符(::)。
4.命名空间可以定义函数/变量/类型。