C 初級主題 名字空間域和類域

2021-07-26 14:31:15 字數 2046 閱讀 7869

在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...