目录
- 一、前言
- 二、命名空间
- 2.1命名空间的定义
- 2.2命名空间的成员调用
- 2.2.1加命名空间名称及作用域限定符
- 2.2.2使用using将命名空间中某个成员引入
- 2.2.3使用using namespace 命名空间名称 引入
- 2.3命名空间的成员的优先级
- 三、using namespace std
一、前言
我们很多接触过C++编程语言的小伙伴们,虽然已经写了不少C++的代码,但是一旦被问到C++中using namespace std;
这段代码是干什么用的,很多小伙伴估计自己也不是很了解(包括我自己,虽然我自己已经写了大概1万多行C++代码)。想要知道这段代码的意义,你的有命名空间的概念。
我们都知道,C语言规定变量名不能与关键字冲突,但是并没有规定变量名不能与库中的变量名冲突,但这在实际的操作的过程中就会产生意想不到的错误:
但当time作为一个全局变量出现的时候,由于time库中也含有一个名叫time的函数名,头文件被展开后,此时编译器已经理解不了这个time是函数还是变量,所以编译器报错了。
在假设一个场景:员工A与员工B在同一家公司开发项目,员工A在编写自己代码时写了一个名叫a的函数,员工B在编写自己代码时写了一个a的变量,那么他们在最后整合成一个项目文件时,这个a是不是也有歧义了?编译器是不是也要"罢工"了?
所以,为了解决这个"坑"C++引入了命名空间这个概念。
二、命名空间
2.1命名空间的定义
定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。如:
namespace Ting
{
int a = 10;
}
命名空间中可以定义变量/函数/类型,如:
namespace Ting
{
int time = 10;
int Add(int left, int right)
{
return left + right;
}
struct Node
{
struct Node* next;
int val;
};
}
命名空间也可以嵌套命名空间,如:
namespace Ting
{
int a;
int b;
int Add(int left, int right)
{
return left + right;
}
namespace ting
{
int c;
int d;
int Sub(int left, int right)
{
return left - right;
}
}
}
同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中。
namespace Ting
{
int Mul(int left, int right)
{
return left * right;
}
}
一个工程中的test.4.6.h和上面test.4.6.cpp中两个Ting会被合并成一个。
2.2命名空间的成员调用
命名空间的使用有三种方式:
- 加命名空间名称及作用域限定符
- 使用using将命名空间中某个成员引入
- 使用using namespace 命名空间名称 引入
注:作用域限定符::
2.2.1加命名空间名称及作用域限定符
2.2.2使用using将命名空间中某个成员引入
2.2.3使用using namespace 命名空间名称 引入
using namespace Ting这段代码可以看成将Ting最外层的大括号去掉,此时t就变成全局变量了,所以就可以被访问到了。
2.3命名空间的成员的优先级
当命名空间里的成员变量与全局变量和局部变量同名时谁的优先级要高?
思考一下下面代码的输出是什么?
#include<iostream>
namespace Ting
{
int t = 10;
}
using namespace Ting;
int t = 100;
int main()
{
int t = 1000;
printf("%d\n", t);
return 0;
}
答案是1000。所以得到的结论是在局部函数里,局部变量优先级比全局变量和命名空间的局部变量都要高。
那这段代码呢?
#include<iostream>
namespace Ting
{
int t = 10;
}
using namespace Ting;
int t = 100;
int main()
{
//int t = 1000;
printf("%d\n", t);
return 0;
}
当准备用代码去验证时就已经发生了错误,但是这也验证了上面的看法。using namespace Ting的作用就是去掉它的大括号,变量t变成了全局变量,但是下面t有被重新声明了,所以编译器报错了。
三、using namespace std
通过上面的学习,我们不难理解using name std的作用是释放std命名空间中的变量名,函数名以及类型名,其中std是C++标准库的命名空间。
我们在书写代码的时候为了方便于是将C++标准库中的命名空间完全展开了,这种做法是不建议的为什么呢?因为你展开的越多,你使用变量就越受限制。最好的做法我想还是用什么放什么,或者前面加上作用域。比如: