目录
1关于命名空间
1.1是什么
1.2解决了什么问题
2.命名空间的定义
2.2命名空间的嵌套定义
3命名空间的特点
3.1命名空间不会影响生命周期
3.2命名空间只能在全局域里定义,当然嵌套定义时例外。
3.3在不同文件中定义相同名称的命名空间
4.命名空间的使用
4.1指定命名空间访问
4.2using展开
4.2.1使用using将命名空间某个成员展开
4.2.2使用using展开命名空间全部成员
1关于命名空间
1.1是什么
它的本质是定义出一个独立的域。(c++中的域有:局部域,全局域,命名空间域和类域)。
1.2解决了什么问题
我们知道不同的域里(例如c语言中我们学习的局部域和全局域),可以定义相同的变量名,函数名等,通过创建独立的域,解决命名冲突的问题。
2.命名空间的定义
2.1基本用法
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
namespace jkd//定义一个命名空间域,命名空间名为jkd
{int rand = 10;char name = xxj;int pop(int left, int right){return left - right;}struct node{struct node* next;int val;};
}//注意这里没有;
int main()
{printf("%p\n", rand);//这里打印的是全局域的rand函数指针(函数名是指针)printf("%d\n", jkd::rand);//这里打印的是jkd命名空间域的rand变量值struct jkd::node newnode;//注意创建命名空间里的结构体类型的结构体,
//格式有点特殊,把struct放前边return 0;
}
在cpp中,编译器语法查找,默认顺序:局部—>全局—>没找到报错
上述代码中出现的: :是域作用限定符,指定作用于域(如果: :前没有写明指定域,默认是全局域),编译器只会在被指定的域里查找。
代码中第一个打印,查找rand,局部没找到,就到全局里找,全局域里有被包含的库函数rand,因此打印的是库函数rand的指针(函数名是指针);
第二个则是在指定的命名空间中查找rand,显然是个变量名,打印变量的值;
运行结果如图
2.2命名空间的嵌套定义
cpp中命名空间是可以嵌套定义的, 用法如下:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
//namespace jkd//定义一个命名空间域,命名空间名为jkd
//{
// int rand = 10;
// char name[] = "xxj";
// int pop(int left, int right)
// {
// return left - right;
// }
//
// struct node
// {
// struct node* next;
// int val;
// };
//}//注意这里没有;namespace jkd
{namespace jxgc{const char* name = "xxj";}namespace jqrgc{const char* name = "sj";}
}
int main()
{//printf("%p\n", rand);//这里打印的是全局域的rand函数指针(函数名是指针)//printf("%d\n", jkd::rand);//这里打印的是jkd命名空间域的rand变量值//struct jkd::node newnode;//注意创建命名空间里的结构体类型的结构体,格式优点特殊,把struct放前边printf("%s\n", jkd::jxgc::name);return 0;
}
按照嵌套顺序使用: :来确定指定域。
3命名空间的特点
3.1命名空间不会影响生命周期
不像局部域(函数体内,生命周期随着函数战争的创建和销毁而变动),命名空间域和类域(类域后边学)不会影响变量的生命周期,需要时调用即可。
3.2命名空间只能在全局域里定义,当然嵌套定义时例外。
3.3在不同文件中定义相同名称的命名空间
在工程项目中,多文件定义的同名命名空间会被当成同一个命名空间这样也方便分工和协作。
把要实现的一个功能所需要的所有函数封装在一个命名空间里,可以简化函数名称,同时也方便调用。
4.命名空间的使用
4.1指定命名空间访问
在项目中推荐使用指定命名空间访问,理由如上3.3
4.2using展开
使用using展开的成员,使用时不再需要域限定操作符(相当于把成员放到全局域),简化代码,省事
4.2.1使用using将命名空间某个成员展开
项目中经常访问且命名不存在冲突的成员推荐使用
用法:
namespace jkd//定义一个命名空间域,命名空间名为jkd
{int rand = 10;char name[] = "xxj";int pop(int left, int right){return left - right;}struct node{struct node* next;int val;};
}//注意这里没有;
using jkd::name;//将jkd命名空间里的name字符串数组展开
4.2.2使用using展开命名空间全部成员
这种做法不太懂推荐,风险大,日常小练习图方便用。
用法:
namespace jkd//定义一个命名空间域,命名空间名为jkd
{int rand = 10;char name[] = "xxj";int pop(int left, int right){return left - right;}struct node{struct node* next;int val;};
}//注意这里没有;
//using jkd::name;//将jkd命名空间里的成员name字符串数组展开
using namespace jkd;//将jkd命名空间所有成员展开