在C++中支持三種域:局部域、名字空間域和類域。
1.名字空間域是隨標準C++而引入的。它相當于一個更加靈活的文件域(全局域),可以用花括號把文件的一部分括起來,并以關鍵字namespace開頭給它起一個名字:
namespace ns1{ float a,b,c; fun1(){……} … }花括號括起來的部分稱聲明塊。聲明塊中可以包括:類、變量(帶有初始化)、函數(帶有定義)等。在域外使用域內的成員時,需加上名字空間名作為前綴,后面加上域操作符“::” 。這里添加了名字空間名稱的成員名被稱為限定修飾名(qualified name)。如:ns1::a,ns1::fun1()等等。 最外層的名字空間域稱為全局名字空間域(global namespace scope),即文件域。
2.名字空間域可分層嵌套,同樣有分層屏蔽作用。例如:
namespace cplusplus_PRimer{ namespace Matrixlib{ //名字空間嵌套 class matrix{……} //名字空間類成員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{ //字符串類public: typedef int index_type;//為易讀易懂用下標型命名 char GetstringElement(index_type elem) { return Astring[elem]; } // Astring未說明private: char Astring[30]; //Astring后說明};表面上看是錯的;實際上是對的。因為Astring名字的解析是在第一步,而內聯函數使用它是在第二步。
這一篇主要闡述一下名字空間域,類域,作用域限定符等問題,為后續開展閱讀源碼的工作做準備,馬上將會講述C++標準庫中的數據結構
新聞熱點
疑難解答