C++定名空間實例解析。本站提示廣大學習愛好者:(C++定名空間實例解析)文章只能為提供參考,不一定能成為您想要的結果。以下是C++定名空間實例解析正文
定名空間是C++異常主要的概念,本文就以實例情勢對其停止深刻剖析,詳細內容以下:
平日來講,在C++中,定名空間(namespace)的目標是為了避免名字抵觸。每一個定名空間是一個感化域,在一切定名空間以外,還存在一個全局定名空間(global namespace),全局定名空間以隱式的方法聲明,它並沒著名字。在定名空間機制中,本來的全局變量,就是位於全局定名空間中(可以用::member的情勢表現)。
1、界說定名空間
1、每一個定名空間都是一個感化域
和其他感化域相似,在定名空間中的每一個名字必需表現獨一實體,而在分歧定名空間中,可以有雷同名字的成員。
2、定名空間可所以不持續的
定名空間可以界說在幾個分歧的部門:
namespace nsp { /* …… */ } // 定名空間感化域前面不必分號
假如之前沒著名為nsp的定名空間界說,則上述代碼創立一個新的定名空間;不然,上述代碼翻開曾經存在的定名空間添加一些新的成員。
3、定名空間是可以嵌套的
嵌套的定名空間是指界說在其他定名空間中的定名空間。嵌套的定名空間是一個嵌套的感化域,內層定名空間聲明的名字將隱蔽外層定名空間聲明的同名成員:
int x = 20; namespace outer { int x = 10; namespace inner { int z = x; } } int main() { std::cout << outer::inner::z; // 輸入10 return 0; }
留意,平日我們不把#include頭文件放在定名空間外部。
4、未定名的定名空間
未定名的定名空間(unnamed namespace)是指症結字namespace後緊跟花括號括起來的一系列聲明語句。未定名的定名空間中界說的變量具有靜態性命周期:它們在第一次應用前創立,而且直到法式停止才燒毀。在尺度C++引入定名空間的概念之前,法式須要將名字聲明成static以使其關於全部文件有用,然則,如今在文件中停止靜態聲明的做法曾經被C++尺度撤消了,取而代之的是應用未定名的定名空間。
一個未定名的定名空間可以在某個給定的文件內不持續,然則不克不及逾越多個文件。也就是說,未定名的定名空間僅在特定的文件外部有用,其感化規模不會橫跨多個分歧的文件。別的,因為未定名的定名空間它沒著名字,所以個中界說的名字的感化域與該定名空間地點的感化域雷同:
int i; // i的全局聲明 namespace { int i; } i = 10; // 毛病,二義性
namespace local { namespace { int i; } } local::i = 42; // 准確
2、應用定名空間
對定名空間中成員的援用,須要應用定名空間的感化域運算符(::)。然則,像namespace_name::member_name如許應用定名空間的成員異常煩瑣,我們須要應用一些其他的更輕便的辦法。
1、定名空間的別號
有些定名空間的名字很長或許定名空間嵌套了許多層,我們可認為其設定一個較短的同義詞,也就是別號:
namespace cln = cpluslus_learning_namespace; namespace Qlib = outer::inner::QueryLib;
2、using聲明
一條using聲明(using declaration)語句一次只引入定名空間的一個成員:
using 定名空間名::[定名空間名::……]成員名; // 例如 using OLib::List;
3、using指導
using指導(using directive)和using聲明分歧的處所是,我們沒法掌握哪些名字是可見的,由於using指導會使得某個特定的定名空間中一切的名字都可見:
using namespace std; // 引入定名空間std
應用定名空間重要是為了避免名字抵觸,假如隨便應用using指導注入定名空間的一切名字,將從新引入名字抵觸的成績。別的,using聲明和using指導在感化域上有差別:using聲明是將一個成員引入以後定名空間感化域內;using指導是將一切成員引入以後和上一層定名空間感化域內:
namespace nsp { // 定名空間 int i=16, j=15; } int j = 0; // 全局變量 int main() { using namespace nsp; // 假如應用j,將在::j和nsp::j之間發生抵觸 std::cout << j; return 0; }
假如將using namespace nsp;改成using聲明using nsp::j;則會准確輸入15。