C++入门篇–命名空间
C++是一门很优秀的语言,C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的程序,需要高度的抽象和建模时,C语言则不合适。为了解决软件危机,20世纪80年代,计算机界提出了OOP(object oriented programming:面向对象)思想,支持面向对象的程序设计语言应运而生。所以C++是一种面向对象的语言。要学C++得有c语言得基础,这样学着会稍微轻松一点。我感觉,C++是在弥补C的不足之处,接下来我们就来讲讲C++的一些新东西。
命名空间 namespace
在C/C++中,变量、函数和类都是会大量存在的,当变量、函数等等都大量存在的时候,有可能会发生命名冲突。再举个例子,在一个大型的项目中,肯定是有一个团队分工合作,一人实现一部分功能,再整合起来。这个时候就可能会出现,几个同伴对于变量的命名出现冲突。所以就有了命名空间。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字就是针对这种问题
命名空间的定义
定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{},把变量、函数名等定义或申明在花括号中。
namespace mynamespace {
//命名空间中的内容可以定义变量,也可以定义函数
int a; // 定义变量
// 定义函数
void swap(int* num1, int* num2){
int tmp = *num1;
*num1 = *num2;
*num2 = tmp;
}
}
命名空间看似陌生,其实可以把命名空间看作是一个域,这个域可以把变量、函数等隔离开,但是命名空间中成员的属性是不变的,如果成员是全局变量,向上面那样定义它依然是全局变量,只不过使用的方式和普通变量略微有些不同,下面会讲到。
我们知道,代码块是可以嵌套的,同样,命名空间也是可以嵌套的,语法如下
namespace mynamespace2{
int a;
int b = 0;
void swap(int* num1, int* num2){
int tmp = *num1;
*num1 = *num2;
*num2 = tmp;
}
namespace mynamespace2_2{
int c;
int d;
int sub(int left, int right){
return left-right;
}
}
}
到这里,我们可能回想,命名空间确实是解决了变量名冲突的问题,那么如果两个命名空间的名字一样了呢,会冲突吗?答案是不会冲突。如果有两个名字一样的命名空间,那么这两个命名空间的成员会和到一起。
命名空间使用
命名空间怎么定义,以及命名空间的用途我们都知道了,接下里就学学怎么使用命名空间。使用命名空间,需要用到using关键字。如果不用using关键字,直接使用命名空间中的变量,编译器会显示,变量未定义。结果如下图
命名空间的使用有三种方式
- 加命名空间名称以及作用域限定符(::)
int main(){
printf("%d\n", mynamespace::a);
return 0;
}
- 使用using将命名空间中成员引入
using mynamespace::b;
int main(){
printf("%d", b);
}
ps:将命名空间中的成员你引入之后,在使用成员时,就不需要再变量前面加命名空间名称和作用域限定符。
- 使用using namespace 命名空间名称引入
using namespace mynamespace;
int main(){
a = 10;
b = 20;
swap(&a, &b);
printf("a = %d b = %d", a, b);
return 0;
}
- 嵌套命名空间的使用
namespace mynamespace2 {
int a;
int b = 0;
void swap(int* num1, int* num2) {
int tmp = *num1;
*num1 = *num2;
*num2 = tmp;
}
namespace mynamespace2_2 {
int c;
int d;
int sub(int left, int right) {
return left - right;
}
}
}
using namespace mynamespace2;
using namespace mynamespace2::mynamespace2_2;
int main()
{
printf("%d\n", mynamespace2::mynamespace2_2::c); // 不使用using,就得在变量名前面加上两个命名空间名称和作用域限定符
printf("%d\n", b);
d = 10;
b = 20;
swap(&a, &b);
printf("a = %d b = %d", a, b);
}
总结
虽然使用命名空间的方式有很多种,但最好的还是第一种,它虽然麻烦,但它实现了隔离冲突域的功能,如果用using将整个命名空间展开,就是去了隔离冲突域的功能。