目錄
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命名空間所有成員展開