🦄个人主页:-雷阵雨-
🦄专栏:c++
⚙️操作环境:Visual Studio 2019
目录
一:前言
本篇博客为大家讲解一下c++命名空间这一重要概念,以及其使用。
二:命名空间
1:命名空间的基本概念
命名空间:是一种用于组织和隔离命名标识符的容器或上下文,他们用于确保吧同范围的标识符不会发生命名冲突。
命名空间:又称名字空间,名称空间,名域,作用域,也算是c++对C语言的缺陷做一个改进。
命名空间:在c++中函数和变量都是唯一的名称,如果多个函数或者变量使用相同的名称,就会出现命名冲突,导致编译错误,为了解决这一麻烦,c++提供了命名空间它可以将一组名称封装在一个特定的域中,使这些名称与其他作用域中的名称区分开来。 它可以包括结构体,函数,类,变量等各种类型的声明和定义
2:命名空间的定义
定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。
书写个代码:
#include<stdio.h> int scanf=0; int mian() { printf("%d", scanf); return 0; }
大家认为这个代码可以运行吗?
这个变量没毛病的,因为我们就需要在C语言中展示这个冲突,c语言中表示不可以使用关键字做变量名,但是没有规定函数名不可以,我们看看终端显示:
出现这个结果是意料之中,我们的头文件<stdio.h>展开包含scanf这个函数。你打印scanf时候就会出现问题,你打印的是那个呢?是库函数的函数名,还是我们创建全局变量,这就是C语言的不足,你必须小心与函数库的函数名发生冲突,从而导致bug。
3:命名空间的使用
1:添加加命名空间 域作用限定符
c++的命名空间就弥补了这一个不足,有了命名空间,我们可以把自己所需要的变量,结构体,函数,存放在这个域中,使用我们直接调运就可以,
代码如下:
namespace lzy { int a = 10; int b = 20; int c = 30; } int main() { printf("a=%d\n", lzy::a); return 0; }
我们就封装了一个名为bit的命名空间,然后我们使用域作用限定符调出来就可以;
lzy::scnaf:直接指定a变量就是lzy空间里面a变量。
运行结果:
2:使用using把命名空间的变量引入
namespace lzy { int a = 10; int b = 20; int c = 30; } using lzy::b; int main() { printf("a=%d\n", lzy::a); printf("b=%d\n", b); return 0; }
using:作用就是展开命名空间。
如图using lzy::b作用就是把命名空间中的b单独展开在全局域当中,就是int b=20;
可以在任何地方调用,就相当没有封装的一个变量,单独展开了。
3:使用using namespace lzy展开命名空间
namespace lzy { int a = 10; int b = 20; int c = 30; } using namespace lzy; int main() { printf("a=%d\n", lzy::a); printf("b=%d\n", lzy::b); printf("c=%d\n", lzy::c); return 0; }
using namespace lzy 这样子就是全部展开,我们命名空间就显的很没作用。
4:命名空间定义函数
namespace lzy { int a = 10; int b = 20; int c = 30; int Add(int left, int right) { return left + right; } } using namespace lzy; int main() { printf("a=%d\n", lzy::a); printf("b=%d\n", lzy::b); printf("c=%d\n", lzy::c); printf("%d\n", lzy::Add(3, 4)); return 0; }
我在命名空间中定义了一个Add函数,求他们的和。
运行结果:
5:命名空间也可以嵌套定义
namespace lzy { int a = 10; int b = 20; int c = 30; int Add(int left, int right) { return left + right; } namespace lzy2 { int Add(int left, int right) { return left + right; } } } using namespace lzy; int main() { printf("a=%d\n", lzy::a); printf("b=%d\n", lzy::b); printf("c=%d\n", lzy::c); printf("%d\n", lzy::Add(3, 4)); printf("%d\n", lzy::lzy2::Add(6, 6)); return 0; }
我们嵌套了一个名为zy2命名空间。
运行结果:
三:总结
本篇博客为大家讲解了命名空间,命名空间在一些大项目较为重要,每个人的想法都不一,这样子就可以避免一些不必要的麻烦,在命名空间的使用时,嵌套命名空间在展开的时候利用域作用限定符逐渐展开就可以。
最后希望这篇文章可以给大家带来帮助。