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

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

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

2020-01-26 14:45:40
字體:
來源:轉載
供稿:網友

命名空間是一個聲明性區域,為其內部的標識符(類型、函數和變量等的名稱)提供一個范圍。命名空間用于將代碼組織到邏輯組中,還可用于避免名稱沖突,尤其是在基本代碼包括多個庫時。命名空間范圍內的所有標識符彼此可見,而沒有任何限制。命名空間之外的標識符可通過使用每個標識符的完全限定名(例如 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
精品精品国产国产自在线| 欧美日本精品在线| 日本久久久久亚洲中字幕| 亚洲国产精品字幕| 亚洲免费视频一区二区| 日韩av一卡二卡| 狠狠色香婷婷久久亚洲精品| 欧美激情一级二级| 日本久久91av| 96sao精品视频在线观看| 国内免费久久久久久久久久久| 日韩欧美一区二区三区久久| 欧美一级在线播放| 久久综合免费视频影院| 欧美高清视频在线观看| 国产精品国产自产拍高清av水多| 久久91亚洲精品中文字幕| 亚洲欧美成人一区二区在线电影| 日韩影视在线观看| 国产成人97精品免费看片| 日本道色综合久久影院| 国产免费一区二区三区在线观看| 欧美最顶级丰满的aⅴ艳星| 色综合色综合网色综合| 69**夜色精品国产69乱| 国产日韩欧美成人| 久热精品在线视频| 亚洲精品综合久久中文字幕| 91精品国产九九九久久久亚洲| 国产一区二区三区精品久久久| 美日韩精品免费视频| 亚洲a在线播放| 欧美成人激情视频| 久久手机免费视频| 日韩在线一区二区三区免费视频| 成人有码在线视频| 色哟哟网站入口亚洲精品| 国产精品无码专区在线观看| 国产不卡一区二区在线播放| 91天堂在线视频| 91大神福利视频在线| 欧美性xxxx极品hd欧美风情| 国产mv久久久| 久久国内精品一国内精品| 热久久视久久精品18亚洲精品| 亚洲精品第一国产综合精品| 亚洲欧美国产va在线影院| 久久亚洲精品网站| 97热精品视频官网| 欧美噜噜久久久xxx| 亚洲九九九在线观看| 精品欧美激情精品一区| 欧美天堂在线观看| 国产精品一区二区久久精品| 久久久久久久av| 色综合久久中文字幕综合网小说| 国产精品国产自产拍高清av水多| 这里只有精品丝袜| 国产精品久久久久久av| 欧美在线日韩在线| 97视频在线播放| 91网站在线免费观看| 久久成人人人人精品欧| 欧美国产欧美亚洲国产日韩mv天天看完整| 欧美人成在线视频| 51精品国产黑色丝袜高跟鞋| 成人福利视频在线观看| 欧美一区亚洲一区| 俺去亚洲欧洲欧美日韩| 这里只有精品在线播放| 欧美性生活大片免费观看网址| 久久久在线视频| 久久国产精品偷| 亚洲成色777777女色窝| 欧美成人三级视频网站| 日韩中文在线中文网在线观看| 国产一区二区久久精品| 欧美主播福利视频| 国产综合视频在线观看| 欧美诱惑福利视频| 久久亚洲春色中文字幕| 91黄色8090| 欧美性xxxxhd| 亚洲韩国日本中文字幕| 久久久国产精品一区| 国产激情久久久| 国产成人精品一区二区在线| 97久久国产精品| 久久香蕉精品香蕉| 国产欧美在线看| 俺去了亚洲欧美日韩| 亚洲成人在线视频播放| 69精品小视频| 色综合久久悠悠| 欧美日韩一区二区精品| 国内揄拍国内精品| 日本亚洲欧美三级| 操日韩av在线电影| 日韩中文字幕视频在线| 在线成人一区二区| 欧美久久精品午夜青青大伊人| 国产精品美女主播在线观看纯欲| 69精品小视频| 欧美日本中文字幕| 国产成人免费av电影| 97视频com| 国产在线日韩在线| 中文字幕日韩精品在线| 在线看福利67194| 欧美一级高清免费| 在线视频欧美日韩精品| 亚洲成av人乱码色午夜| 国产91精品在线播放| 亚洲电影在线看| 91久久久亚洲精品| 51视频国产精品一区二区| 国产精品成熟老女人| 国产精欧美一区二区三区| 亚洲视频免费一区| 成人国产在线视频| 精品国偷自产在线视频99| 综合激情国产一区| 国产精品最新在线观看| 欧美成年人网站| 一区二区三区亚洲| 欧美日韩国产精品一区| 91在线免费看网站| 在线电影av不卡网址| 日韩在线视频线视频免费网站| 色七七影院综合| 日韩av中文字幕在线免费观看| 国产主播喷水一区二区| 日韩影视在线观看| 国模精品视频一区二区| 亚洲午夜激情免费视频| 日韩av影视在线| 国产精品流白浆视频| 97色在线播放视频| 欧美亚洲另类制服自拍| 欧美成人久久久| 668精品在线视频| 91久热免费在线视频| 日韩中文av在线| 国产精品视频不卡| 成人精品视频久久久久| 日韩欧美高清在线视频| 欧美性极品少妇精品网站| 国产精品久久一| 欧美大片在线看免费观看| 中文字幕视频在线免费欧美日韩综合在线看| 国产欧美欧洲在线观看| 亚洲成人国产精品| 成人a免费视频| 91亚洲精品久久久久久久久久久久| 欧美一区二粉嫩精品国产一线天| 97色在线视频| 狠狠久久亚洲欧美专区| 国产精品电影网| 久久久久免费精品国产| 久久中国妇女中文字幕| 国产精品xxx视频| 亚洲精品影视在线观看| 少妇激情综合网| 久久精品视频在线观看|