命名空间概念
在初学C++时,会写到的第一段代码肯定是这个:
#include<iostream>
using namespace std;
int main()
{
cout<<"hello world"<<endl;
return 0;
}
我相信大多数初学者还是不知道前两行代码的意思,其实一开始我也不知道,老师说这样写就这样写,记住就行了,后来我渐渐弄明白了,第一行好理解,就是标准输入输出头文件,重点是第二行代码,说实话一开始我是真的不知道这一行代码的作用是什么,就只知道这样写就行了,后面踩坑了以后才知道去查去弄明白,所以每一个坑其实都是自己进步的台阶。
这一行代码涉及的知识叫做命名空间,怎么理解命名空间,先看下面代码:
#include<iostream>
using namespace std;
int main()
{
int cout = 0;
cout << cout << endl;
return 0;
}
运行结果就是直接挂了,在C++中变量、函数和类都是大量存在的,这些变量、函数和类的名称都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突和名字污染。
提炼几点关键信息:
- 使用命名空间是为了避免命名冲突或名字污染
- 关键词:namespace
- 既可以定义变量也可以定义函数
命名空间定义
- 普通定义
定义命名空间需要使用namespace关键词
先定义一个普通的命名空间Nanlin_1
namespace Nanlin_1
{
int a; //定义变量
int Add(int b,int c)//定义函数
{
return b+c;
}
}
- 命名空间也是可以嵌套的
namespace Nanlin_2
{
int a;
int Add(int b,int c)
{
return b+c;
}
namespace Nanlin_3
{
int d;
int Sub(int e,int f)
{
return e+f;
}
}
}
- 同一个工程中是可以存在多个相同名称的命名空间的,编译器最终会将他们合在一个命名空间中
- 需要注意的一点是一个命名空间实际上就是定义了一个新的作用域,命名空间中的所有内容都局限在这个命名空间中。
命名空间用法
命名空间有三种使用方法,分别用代码说明解释
统一使用命名空间Nanlin
namespace Nanlin
{
int a=1;
int b=2;
}
-
using namespace Nanlin
和using namespace std是一样的,这个是将C++标准库里的全展开,cout、cin等等都是可以直接使用的,看下面代码运行结果,在main函数里是可以直接使用a和b的。
总结一下,这种使用方法的好处是便捷,但是带来了命名污染 -
using Nanlin::a
这种就是将命名空间里的a单独放出来,可以随便使用
这次如果再使用b就会报错,如果只使用a就可以运行,但是如果想使用b该如何使用呢,看第三种使用方法
总结一下,这种方式是单独放出命名空间中某一个变量、函数。
- Nanlin::a、Nanlin::b
上面两种一个是全部展开随便使用,一个是单独展开一个,这种就是不展开,指定访问。
我要用a我就指定访问a,要用b就指定访问b
当然以上三种使用方法都是可以混合使用的