您好,登錄后才能下訂單哦!
本篇文章為大家展示了C++ 名稱空間以及其特性是什么,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
聲明區域(declaration region
): 聲明區域是可以在其中進行聲明的區域。例如,可以在函數外面聲明全局變量,對于這種變量,那么它的聲明區域為其聲明所在的文件。對于在函數中聲明的變量,聲明區域為其聲明所在的代碼塊。
潛在作用域(potential scope
): 變量的潛在作用域從聲明點開始,到其聲明區域的結尾。因此潛在作用域比聲明區域小,這是由于變量在定義之后才能使用。
C++包含了一種功能,即通過定義一種新的聲明區域來創建命名的名稱空間,這樣做的目的之一是提供一個聲明名稱的區域。一個名稱空間中的名稱不會與另外一個名稱空間的相同名稱發生沖突,同時允許程序其他部分使用該名稱空間中聲明的東西。 例如,使用關鍵字namespace
創建兩個名稱空間:
namespace Jack { double pail; // variable declaration void fetch(); // function prototype int pal; // variable declaration struct Well {...} // structure declaration } namespace Jill { double bucket(double n) {...}; // variable declaration double fetch; // variable declaration int pal; // variable declaration struct Hill {...} // structure declaration }
名稱空間是開放的(open
),即可以把名稱加到已有的名稱空間中。例如,下面這條語句將名稱goose
添加到Jill中已有的名稱列表中:
namespace Jill { char* goose(const char*); }
同樣,原來的Jack
名稱空間為fech()
函數提供了原型。可以在該文件后面(或者另一個文件中)再次使用Jack名稱空間來提供函數的代碼:
namespace Jack { void fetch() { ... } }
需要訪問給定名稱空間的名稱時,通過作用域解析運算符::,使用名稱空間來限定該名稱。
當我們不希望每次使用名稱時都對它進行限定,因此c++提供了兩種機制(using
聲明和using
編譯指令)來簡化對名稱空間中名稱的使用。
using聲明:使特定聲明的標識符可用
namespace Jill { double bucket(double n) { ... } double fetch; } char fetch; int main() { using Jill::fetch // using declaration double fetch; // Error! Already have a local fetch cin >> fetch; // read a value into Jill::fetch cin >> ::fetch; // read a value into global fetch }
這段代碼,using
聲明將特定的名稱添加到它所屬的聲明區域中。main()
中的using聲明將fetch
添加到main()
定義的聲明區域中。完成聲明后,便可以使用名稱fetch
代替Jill::fetch
。
using編譯指令:使整個名稱空間可用
using
編譯指令使所有的名稱都可用。在全局聲明區域中使用using
編譯指令,將使該名稱空間的名稱全局可用。例如:
#include <iostream> using namespace std; // 在函數中使用using編譯指令,將使其中的名稱在函數中可用 int main() { using namespace jack; // make names available in vorn() }
不同的命名空間表示不同的內存單元,以下情況會存在二義性問題,使用時應該注意。
using namespace jack using namespace jill // 二者空間中都有pal變量 pal = 4; // which one? now have a conflict
一般來說,使用using
聲明比使用using
編譯指令更安全,這是由于它只導入指定的名稱。如果該名稱與局部名稱發生沖突,編譯器會發出指示。using編譯指令導入所有名稱,包括一些實際并不需要的。如果與局部名稱發生沖突,局部覆蓋名稱空間的版本,而編譯器不會發出警告。
名稱空間可以嵌套
namespace elements { namespace fire { int flame; ... } float water; }
訪問flame指的是elements::fire::flame
,同樣也可以使用using編譯指令使內部的名稱可用:using elements::fire
在名稱空間中使用using編譯指令和using聲明,如下:
namespace myth { using Jill::fetch; using namespace elements; using std::count; }
如果要訪問Jill::fetch,以下兩種方式均可訪問它。
myth::fetch Jill::fetch
名稱空間的傳遞性
using編譯指令是可以傳遞的。如果A op B且B op C,則A op C。
using namespace myth; /// 以上和下面兩句等價 using namespace myth; using namespace elements; // 給命名空間創建別名 namespace MEF = myth::elements::fire; using MEF::flame;
未命名的名稱空間
往往是靜態變量的替代品。
static int counts //全局聲明 static storage, internal linkage /// 等價于 namespace { int counts // static storage, internal linkage }
上述內容就是C++ 名稱空間以及其特性是什么,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。