在c++中支援三種域:區域性域、名字空間域和類域。
1.名字空間域是隨標準c++而引入的。它相當於乙個更加靈活的檔案域(全域性域),可以用花括號把檔案的一部分括起來,並以關鍵字namespace開頭給它起乙個名字:
namespace
ns1 … }
花括號括起來的部分稱宣告塊。宣告塊中可以包括:類、變數(帶有初始化)、函式(帶有定義)等。在域外使用域內的成員時,需加上名字空間名作為字首,後面加上域操作符「::」。這裡新增了名字空間名稱的成員名被稱為限定修飾名(qualified name)。如:ns1::a,ns1::fun1()等等。
最外層的名字空間域稱為全域性名字空間域(global namespace scope),即檔案域。
2.名字空間域可分層巢狀,同樣有分層遮蔽作用。例如:
namespace cplusplus_primer //名字空間類成員matrix
…... } }
訪問matrix,可寫:cplusplus_primer::matrixlib::matrix 。
使用using宣告可只寫一次限定修飾名。using宣告以關鍵字using開頭,後面是被限定修飾的(qualified)名字空間成員名:
using cplusplus_primer:
:matrixlib
::matrix;//名字空間類成員matrix的using宣告
以後在程式中使用matrix時,就可以直接使用成員名,而不必使用限定修飾名。
3.使用using指示符可以一次性地使名字空間中所有成員都可以直接被使用,比using宣告方便。using指示符以關鍵字using開頭,後面是關鍵字namespace,然後是名字空間名。
標準c++庫中的所有元件都是在乙個被稱為std的名字空間中宣告和定義的。在採用標準c++的平台上使用標準c++庫中的元件,只要寫乙個using指示符:
using namespace std;
就可以直接使用標準c++庫中的所有成員。這是很方便的。
名字空間可以不連續,分為多段,但它們仍是同乙個名字空間。名字空間域不能定義在函式宣告、函式定義或類定義的內部。
4.名字空間域的引入,主要是為了解決全域性名字空間汙染(global namespace pollution)問題,即防止程式中的全域性實體名與c++各種庫中宣告的全域性實體名衝突。
1.類體也定義了乙個域稱為類域。在類域中說明的識別符號僅在該類的類域內有效。必須加上「類名::」作限定修飾。
2.類的實體——物件中的公有成員也可以在物件之外訪問,但必須使用成員訪問操作符「.」,物件名+「.」+成員名。
3.定義類本身的目的就是要實現乙個封裝性,對外是封閉的,對內是開放的,在程式中並不總是需要用成員訪問符之類來引用類成員。多數程式**本身就在類域中,這些程式可以直接訪問類成員。
4.####在類域中類成員在類體中被宣告的順序同樣很重要,後宣告的成員不能被先宣告的成員引用。
第一步查詢在宣告中用到的名字,包括資料成員和函式成員宣告中用到的引數型別,第二步才是函式成員體內的名字。例如:
class string
// astring未說明
private:
char astring[30]; //astring後說明
};
表面上看是錯的;實際上是對的。因為astring名字的解析是在第一步,而內聯函式使用它是在第二步。
這一篇主要闡述一下名字空間域,類域,作用域限定符等問題,為後續開展閱讀原始碼的工作做準備,馬上將會講述c++標準庫中的資料結構
Python 之作用域和名字空間
python有乙個核心概念是名字空間 namespace namespace是乙個name到object 的對映關係,python有很多namespace,因此,在 中如果碰到乙個標誌符 name 需要有乙個規則來決定去哪個namespace查詢 這就是legb。legb決定了name的查詢順序 l...
C 網域名稱空間和作用域
網域名稱空間 通俗的講就是在乙個大括號括起來的範圍,然後用乙個名稱來稱呼。再通俗點就是告訴別人這是在哪個地盤內的事情 作用域 作用域就是宣告地盤,宣告在某個地盤,屬於哪個地盤的東西 作用域分為全域性作用域和指定區域性作用域 全域性作用域 全域性宣告的變數和函式預設作用域是全域性的,區域性的只是在乙個...
C 基類 和 派生類 作用域的效果
author yao h.wang 測試 如下 1 include stdafx.h 2 include 34 using namespace std 56 class base 7 14 protected 15int proi 16void pro 17 20private 21int prii...