C++入门基础☞命名空间
提示:本文所用环境基于C++98标准,C++是兼容C的。
提示:以下是本篇文章正文内容,下面案例可供参考
命名空间
一、命名空间是什么?
在编写程序C程序时,也许会遇到我们定义的变量、函数名与库里的重名而发生冲突,不仅如此,在面对一些大型的多人协作编写的程序中,两个人写的代码,也许会因相同名字的标识符而发生冲突,然而它们名字相同,本质却是不同,这点是不同于函数重载的。为了有效地解决这一问题,C++提出了命名空间。
涉及关键字:namespace
二、命名空间的创建
命名空间的创建:
namespace 名字
{
……
}
其中,名字指的是:为该命名空间所取的一个名字。
例如:
namespace YDY
{
int rand = 0;
}
创建一个名为YDY的命名空间。命名空间里可以定义函数/变量名/类型。
实际上命名空间定义了一个域。 命名空间中的所有内容都局限于该命名空间中
创建了一个命名空间后我们如何才能访问到这个域里的内容呢?
上述例子中,并没有访问到YDY这个命名空间所定义的域里的rand,如果它访问到了,打印出来的应该是0,它真正使用的rand其实是stdlib.h这个文件里的rand。
这里我们不得不提到一个重要的符号: ::
这个符号称为:域作用限定符
使用方式为:域::标识符,含义为该标识符为该域里的标识符。
YDY::rand,YDY这个域里的rand。
它依旧是一个全局变量,放在静态区里的。
另外,命名空间是允许嵌套定义的。例如:
//命名空间可以嵌套定义
namespace N1
{
int a = 0;
int ADD(int x, int y)
{
return x + y;
}
namespace N2
{
int a = 0;
int SUB(int x, int y)
{
return x - y;
}
}
}
如何访问?
//调用ADD函数
N1::ADD(1, 2);
//调用SUB函数
N1::N2::SUB(5, 1);
我们已经知道,namespace可以解决命名冲突的问题,但是如果我们命名了两个名字相同的命名空间呢?
它并不会报错,在程序编译时,编译器会把它两整合为一个命名空间。
三、命名空间的使用
命名空间的使用方式一共有三种:
- 加命名空间名称及作用域限定符。
也就是你需要使用哪一个时,就展开那一个。
//加命名空间名称及作用域限定符
int main(void)
{
printf("%d\n", N::a);
return 0;
}
- 使用using将命名空间中成员引入
可以直接展开你经常使用的那一个。
//使用using将命名空间中成员引入
using N::b;
int main()
{
printf("%d\n", N::a);
printf("%d\n", b);
return 0;
}
- 使用using namespace 命名空间名称引入
直接将整个命名空间展开。
//使用using namespace 命名空间名称引入
using namespace N;
int main()
{
printf("%d\n", N::a);
printf("%d\n", b);
Add(10, 20);
return 0;
}
总结
现在再来看一下C++的模板也就能够不那么晕了
# include <iostream>
using namespace std;
int main(void)
{
……
return 0;
}
using namespace std;
代表的含义就是展开 std
这个命名空间,因为C++所需的大部分库函数的定义都存放在这个std这个命名空间所定义的域里面,我们要想使用它们就必须展开。但是,这里也有一个非常大的问题,如果我们直接将命名空间展开来,就相当于这个命名空间定义就没有意义了,所以需要谨慎使用。