c++名稱空間 (c++ primer plus 筆記)
阿新 • • 發佈:2018-04-22
枚舉 嵌套 另一個 常量 函數 rim 包含 外部 文件的
c++名稱空間
- 名稱空間術語
- 新的名稱空間特性
- 名稱空間的使用理念
- 名稱空間術語
c++中的名稱包括:變量、函數、結構、枚舉、類以及類和結構的成員。
名稱空間作用:當程序項目越來越大時,c++中的名稱沖突可能性將會增加,名稱空間的出現即為了解決c++中名稱沖突問題。
聲明區域:是可以在其中進行聲明的區域。例如,全局變量其聲明區域為其聲明所在的文件,局部變量其聲明區域為其聲明所在的代碼塊。
潛在作用域:變量的潛在作用域從聲明點開始,到其聲明區域的結尾。因此潛在作用域比聲明區域小,這是由於變量必須在定義後才能使用。但聲明區域中的變量並非在潛在作用域的任何位置都是可見的,它可能被別一個在嵌套聲明區域中聲明的同名變量隱藏。 新的名稱空間特性
名稱空間作用:
c++新增了一種功能,即通過定義一種新的聲明區域來創建命名的名稱空間,這樣做的目的之一是提供一個聲明名稱的區域。一個名稱空間中的名稱不會與另外一個名稱相同名稱發生沖突,同時允許程序的其他部分使用該名稱聲明的東西。
創建名稱空間關鍵字namespace,語法格式如下:namespace name { int value; void func(); }
- 名稱空間可以是全局的,也可以位於另一個名稱空間中,但不能位於代碼塊中。
- 名稱空間中聲明的名稱的鏈接性為外部的,除非它引用了常量。
- 全局名稱空間對應於文件級聲明區域,全局變量位於全局名稱空間中。
- 名稱空間中的聲明和定義規則同全局聲明和定義規則相同。
名稱空間是開放的,可以把名稱加入到已有的名稱空間中。語法格式如下:
namespace name { double value2; }
為名稱空間中的函數原型提供定義的語法格式如下:如下:如下(可在 該文件後面或另一個文件中提供定義):
namespace name { void func() { .... } }
訪問名稱空間:未被裝飾的名稱稱為未限定的名稱;包含名稱空間的名稱稱為限定的名稱。
使用解析運算符訪問名稱:name::value = 100;
使用using聲明和using編譯指令簡化對名稱空間的訪問:
using name::value; using namespace name;
- using聲明將特定的名稱添加到它所屬的聲明區域後,便可以使用value代替name::value,以簡化代碼。
- 關鍵字using namespace使名稱空間中的所有名稱都可用,而不需要使用域解析運算符。
- 在全局聲明區域中使用using編譯指令,將使該名稱空間的名稱全局可用。
- 使用域解析運算符可避免名稱二義性,using聲明和using編譯指令,可能導致名稱二義性。
如果名稱空間和聲明區域定義了相同的名稱,則不能用using聲明導入名稱空間,這樣會導致名稱沖突,編譯器不允許這樣做。但可以用using編譯指令導入名稱空間,此時只是局部名稱隱藏了名稱空間名,用域解析運算符就可以訪問了。
using聲明比using編譯指令更安全,因為如果有名稱與局部名稱發生沖突,編譯器會發出指示,而後者不會發出警告。
名稱空間嵌套namespace name1 { namespace name2 { int value2; } int value1; }
訪問value2的方法:
using name1::name2::value2; value2 = 100; using namespace name1::name2; value2 = 100; using namespace name1; name2::value2 = 100;
- using編譯指令是可以傳遞的,即嵌套的名稱空間會一起被導入。
- 創建名稱空間別名:namespace alias_name = name;可以用來簡化對嵌套名稱空間的使用。
未命名的名稱空間:可以通過省略名稱空間的名稱來創建未命令的名稱空間。就像後面跟著using編譯指令一樣,也就是說,在該名稱空間中聲明的名稱的潛在作用域為:從聲明點開始到該聲明區域的末尾。不能在未命名名稱空間所屬文件之外使用名稱空間中的名稱,即提供了鏈接性為內部的靜態變量的替代品。
3.名稱空間的使用理念
- 使用在已命名的名稱空間中聲明的變量,而不是使用外部全局變量。
- 使用在已命名的名稱空間中聲明的變量,而不是使用靜態全局變量。
- 如果開發一個函數庫或類庫,將其放在一個名稱空間中。例如c++提倡將標準函數庫放在名稱空間std中。
- 僅將編譯指令using作為一種將舊代碼轉換為使用名稱空間的權宜之計。
- 不要在頭文件中使用using編譯指令。首先,這樣做掩蓋了要讓哪些名稱可用;另外,包含頭文件的順序可能影響程序的行為。如果非要使用,應將其放在所有預處理器編譯指令#include之後。
- 導入名稱時,首先使用作用域解析運算符或using聲明方法。
- 對於using聲明,首先將其作用域設置為局部而不是全局。
c++名稱空間 (c++ primer plus 筆記)