亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C++編程中的命名空間基本知識講解

2020-05-23 14:10:09
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了C++編程中的命名空間基本知識講解,包括對C++11中內聯命名空間新特性的介紹,需要的朋友可以參考下
 

命名空間是一個聲明性區域,為其內部的標識符(類型、函數和變量等的名稱)提供一個范圍。命名空間用于將代碼組織到邏輯組中,還可用于避免名稱沖突,尤其是在基本代碼包括多個庫時。命名空間范圍內的所有標識符彼此可見,而沒有任何限制。命名空間之外的標識符可通過使用每個標識符的完全限定名(例如 std::vector<std::string> vec;)來訪問成員,也可通過單個標識符的 using 聲明 (using std::string) 或命名空間中所有標識符的 using 指令 (C++) (using namespace std;) 來訪問成員。頭文件中的代碼應始終使用完全限定的命名空間名稱。
下面的示例演示了一個命名空間聲明和命名空間之外的代碼可訪問其成員的三種方法。

namespace ContosoData{  class ObjectManager  { public:  void DoSomething() {} }; void Func(ObjectManager) {}}

使用完全限定名:

ContosoData::ObjectManager mgr;mgr.DoSomething();ContosoData::Func(mgr);

使用 using 聲明,以將一個標識符引入范圍:

using WidgetsUnlimited::ObjectManager;ObjectManager mgr;mgr.DoSomething();

使用 using 指令,以將命名空間中的所有內容引入范圍:

using namespace WidgetsUnlimited;ObjectManager mgr;mgr.DoSomething();Func(mgr);

using 指令
通過 using 指令,可使用命名空間中的所有名稱,而不需要命名空間名稱為顯式限定符。如果在一個命名空間中使用多個不同的標識符,則在實現文件中使用 using 指令(即*.cpp);如果僅使用一個或兩個標識符,則考慮使用聲明,以僅將這些標識符而不是命名空間中的所有標識符引入范圍。如果本地變量的名稱與命名空間變量的名稱相同,則隱藏命名空間變量。使命名空間變量具有與全局變量相同的名稱是錯誤的。
注意
using 指令可以放置在 .cpp 文件的頂部(在文件范圍內),或放置在類或函數定義內。
一般情況下,避免將 using 指令放置在頭文件 (*.h) 中,因為任何包含該標頭的文件都會將命名空間中的所有內容引入范圍,這將導致非常難以調試的名稱隱藏和名稱沖突問題。在頭文件中,始終使用完全限定名。如果這些名稱太長,可以使用命名空間別名將其縮短。(請參閱下文。)
聲明命名空間和命名空間成員
通常情況下,在頭文件中聲明一個命名空間。如果函數實現位于一個單獨的文件中,則限定函數名稱,如本示例所示。

//contosoData.h #pragma oncenamespace ContosoDataServer{ void Foo(); int Bar();}contosodata.cpp 中的函數實現應使用完全限定名,即使將一個 using 指令放置于文件的頂部也是如此:#include "contosodata.h"using namespace ContosoDataServer; void ContosoDataServer::Foo(){ //no qualification because using directive above Bar(); }int ContosoDataServer::Bar(){return 0;}

可以在單個文件中的多個塊中聲明命名空間,也可在多個文件中聲明命名空間。編譯器在預處理過程中將各部分聯接在一起,產生的命名空間中包含所有部分中聲明的所有成員。一個相關示例是在標準庫中的每個頭文件中聲明的 std 命名空間。
指定的命名空間的成員可以在定義的名稱的顯式限定所聲明的命名空間的外部進行定義。但是,定義必須出現在命名空間中的聲明位置之后,該命名空間包含在聲明的命名空間中。例如:

// defining_namespace_members.cpp// C2039 expectednamespace V {  void f(); } void V::f() { }  // ok void V::g() { }  // C2039, g() is not yet a member of V namespace V {  void g(); }}

當跨多個頭文件聲明命名空間成員,并且未以正確的順序包含這些標頭時,可能出現此錯誤。
全局命名空間
如果未在顯式命名空間中聲明某個標識符,則該標識符屬于隱式全局命名空間的一部分。通常情況下,如果可能,嘗試避免在全局范圍內進行聲明,入口點 main 函數除外,它必須位于全局命名空間中。若要顯式限定全局標識符,請使用沒有名稱的范圍解析運算符,如 ::SomeFunction(x); 中所示。這將使標識符與任何其他命名空間中具有相同名稱的任何內容區分開來,并且還有助于使其他人更輕松地了解你的代碼。
Std 命名空間
所有 C++ 標準庫類型和函數都在 std 命名空間或嵌套在 std 內的命名空間中進行聲明。
嵌套命名空間
可以嵌套命名空間。普通的嵌套命名空間具有對其父級成員的非限定訪問權限,而父成員不具有對嵌套命名空間的非限定訪問權限(除非它被聲明為內聯),如下面的示例所示:

namespace ContosoDataServer{ void Foo();  namespace Details {  int CountImpl;  void Ban() { return Foo(); } } int Bar(){...}; int Baz(int i) { return Details::CountImpl; } }

普通嵌套命名空間可用于封裝不屬于父命名空間的公共接口的一部分的內部實現詳細信息。
內聯命名空間 (C++ 11)
與普通嵌套命名空間不同,內聯命名空間的成員會被視為父命名空間的成員。這一特性使針對重載函數的依賴于參數的查找可以對父命名空間和嵌套內聯命名空間中具有重載的函數起作用。它還可讓你在內聯命名空間中聲明的模板的父命名空間中聲明專用化。下面的示例演示在默認情況下,外部代碼如何綁定到內聯命名空間:

//Header.h#include <string>namespace Test{ namespace old_ns {  std::string Func() { return std::string("Hello from old"); } } inline namespace new_ns {  std::string Func() { return std::string("Hello from new"); } }}#include "header.h"#include <string>#include <iostream>int main(){ using namespace Test; using namespace std; string s = Func(); std::cout << s << std::endl; // "Hello from new" return 0;}

下面的示例演示如何在內聯命名空間中聲明的模板的父命名空間中聲明專用化:

namespace Parent{ inline namespace new_ns {   template <typename T>   struct C   {    T member;   }; }  template<>  class C<int> {};}

 

可以將內聯命名空間用作版本控制機制,以管理對庫的公共接口的更改。例如,可以創建單個父命名空間,并將接口的每個版本封裝到嵌套在父命名空間內的其自己的命名空間中。保留最新或首選的版本的命名空間限定為內聯,并因此以父命名空間的直接成員的形式公開。調用 Parent::Class 的客戶端代碼將自動綁定到新代碼。通過使用指向包含該代碼的嵌套命名空間的完全限定路徑,選擇使用較舊版本的客戶端仍可以對其進行訪問。
Inline 關鍵字必須應用到編譯單元中命名空間的第一個聲明中。
下面的示例演示一個接口的兩個版本,每個版本位于一個嵌套命名空間中。通過 v_10 接口對 v_20 命名空間進行了某些修改,且該命名空間被標記為內聯。使用新庫并調用 Contoso::Funcs::Add 的客戶端代碼將調用 v_20 版本。嘗試調用 Contoso::Funcs::Divide 的代碼現在將獲取一個編譯時錯誤。如果它們確實需要該函數,則仍可以通過顯式調用 Contoso::v_10::Funcs::Divide 訪問 v_10 版本。

namespace Contoso{ namespace v_10 {  template <typename T>  class Funcs  {  public:   Funcs(void);   T Add(T a, T b);   T Subtract(T a, T b);   T Multiply(T a, T b);   T Divide(T a, T b);  }; } inline namespace v_20 {  template <typename T>  class Funcs  {  public:   Funcs(void);   T Add(T a, T b);   T Subtract(T a, T b);   T Multiply(T a, T b);   std::vector<double> Log(double);   T Accumulate(std::vector<T> nums);  }; }}


命名空間別名
命名空間名稱必須是唯一的,這意味著通常它們不應太短。如果名稱的長度使代碼難以閱讀,或在不能使用 using 指令的頭文件中進行鍵入單調乏味,則可以使用用作實際名稱的縮寫的命名空間別名。例如:

namespace a_very_long_namespace_name { class Foo {}; }namespace AVLNN = a_very_long_namespace_name;void Bar(AVLNN::Foo foo){ }

匿名或未命名的命名空間
可以創建顯式命名空間,但不為其提供一個名稱:

namespace{ int MyFunc(){}}

這稱為未命名的命名空間或匿名命名空間,在你想要使變量聲明對于其他文件中的代碼不可見(即為它們提供內部鏈接),而不必創建已命名的命名空間時非常有用。同一文件中的所有代碼都可以看到未命名的命名空間中的標識符,但這些標識符以及命名空間本身在該文件外部(或更準確地說,在翻譯單元外部)不可見。



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品v片在线观看不卡| 中文字幕欧美日韩| 久久久久日韩精品久久久男男| 欧美高清在线观看| 成人网在线免费观看| 日韩小视频网址| 亚洲国产又黄又爽女人高潮的| 国产精品视频久| 狠狠躁天天躁日日躁欧美| 91视频国产精品| 国产欧美一区二区| 欧美激情videos| 欧美日韩美女在线观看| 日韩国产高清污视频在线观看| 亚洲第一中文字幕在线观看| 国语对白做受69| 亚洲嫩模很污视频| 97久久超碰福利国产精品…| 性色av一区二区三区红粉影视| 欧洲日本亚洲国产区| 伊人久久大香线蕉av一区二区| 深夜福利日韩在线看| 中文字幕精品www乱入免费视频| 中文字幕亚洲综合| 米奇精品一区二区三区在线观看| 奇米成人av国产一区二区三区| www国产亚洲精品久久网站| 欧美激情第三页| 一本一本久久a久久精品综合小说| 国产精品免费一区豆花| 亚洲性视频网站| 国产日本欧美一区二区三区在线| 欧美一区二区.| 福利二区91精品bt7086| 在线精品国产成人综合| 亚洲尤物视频网| 亚洲成色777777女色窝| 久久国内精品一国内精品| 国内成人精品一区| 久精品免费视频| 成人在线视频网| 91日本在线观看| 亚洲精品国产品国语在线| 欧美性视频精品| 在线一区二区日韩| 精品国产乱码久久久久久婷婷| 亚洲最新av网址| 91高清视频免费观看| 日韩专区在线播放| 亚洲在线观看视频| 亚洲男子天堂网| 久久久免费观看视频| 色悠悠久久88| 亚洲欧美综合另类中字| 97视频免费观看| 日本精品免费一区二区三区| 色多多国产成人永久免费网站| 久久777国产线看观看精品| 久久福利网址导航| 欧美国产日本高清在线| 久久影院资源网| 亚洲美女中文字幕| 色婷婷综合久久久久中文字幕1| 亚洲a中文字幕| 97久久超碰福利国产精品…| 国产成人亚洲精品| 国产精品成人一区二区三区吃奶| 国产主播喷水一区二区| 啊v视频在线一区二区三区| 久久91精品国产91久久跳| 欧美裸体男粗大视频在线观看| 欧美一区二区色| 国产一区二区黄| 91亚洲国产成人久久精品网站| 亚洲精品第一国产综合精品| 亚洲欧美国产精品| 久久久久国产精品一区| 亚洲精品一区久久久久久| 欧美猛男性生活免费| 欧美成人四级hd版| 亚洲日本成人网| 亚洲精品电影久久久| 国产日韩欧美中文在线播放| 日韩av电影在线播放| 精品久久久在线观看| 95av在线视频| 久久久久国色av免费观看性色| 欧美超级乱淫片喷水| 亚洲全黄一级网站| 久久视频这里只有精品| 亚洲精品午夜精品| 久久久久久av| 日韩av中文字幕在线免费观看| 亚洲国产成人精品女人久久久| 欧美高清理论片| 久久综合88中文色鬼| 亚洲娇小xxxx欧美娇小| 精品视频在线播放| 日韩中文字幕免费看| 色综合久久88色综合天天看泰| 久久综合色影院| 欧美激情精品久久久久久免费印度| 97久久精品在线| 久久精品亚洲精品| 欧美在线性视频| 亚洲free性xxxx护士hd| 亚洲精品www| 国产脚交av在线一区二区| 欧美在线观看网站| 日韩中文字幕不卡视频| 日韩欧美在线中文字幕| 91精品国产99| 午夜精品久久久99热福利| 国产精品爽黄69天堂a| 欧美理论电影在线观看| 久久精品夜夜夜夜夜久久| 亚洲人成在线观| 亚洲福利在线观看| 日韩在线观看免费全集电视剧网站| 久久久免费观看| 国产亚洲人成a一在线v站| 国产精品视频99| 欧美一区二粉嫩精品国产一线天| 亚洲最大福利视频网| 久久久国产在线视频| 久久久久久久久久久久久久久久久久av| 国产一区二区三区毛片| 国产精品美女免费视频| 欧美壮男野外gaytube| 国产69久久精品成人| 国产精品入口日韩视频大尺度| 91免费人成网站在线观看18| 久久久久www| 久久亚洲精品小早川怜子66| 欧美成人免费全部| 91精品综合久久久久久五月天| 亚洲成**性毛茸茸| 亚洲国产精品一区二区久| 亚洲一区二区三区香蕉| 91精品啪aⅴ在线观看国产| 一区二区三区高清国产| 91沈先生在线观看| 国产91精品久久久久久| 久久国产精品久久久久久久久久| 久久久久久久久久久免费精品| 色综合天天综合网国产成人网| 国产97在线|亚洲| 日韩欧美在线视频观看| 欧美日韩国产va另类| 国产精品视频大全| 国产日韩欧美黄色| 国产99久久精品一区二区 夜夜躁日日躁| 国产欧美一区二区三区在线| 日韩欧美在线国产| 亚洲丁香婷深爱综合| 国产精品视频白浆免费视频| 茄子视频成人在线| 国产欧美在线观看| 日韩欧美大尺度| 国产在线不卡精品| 欧美日韩在线一区| 国产精品极品美女粉嫩高清在线| 国产精品欧美一区二区三区奶水| 国产精品久久久久久久久粉嫩av|