簡介
名稱的聲明區域是它可能保持有效的最大的程式結構,即名稱在單個程式中起作用的最大範圍,可以是在程式文本的區域沒有兩個實體被允許具有相同的名稱。在方法的上下文中表征聲明空間的一種方法是說“類中具有相同名稱的所有重載方法的集合”構成“實體”。表征方法的另一種方法是調整聲明空間的定義,以表示除了一組方法之外,不允許兩個事物具有相同的名稱,這些方法在簽名方面都不相同。聲明區域類型有很多如整個編譯單元、整個名字空間、一對花括弧{與}括起來的整個語句塊、整個函式體(甚至包括函式的形參列表)、類定義(包括成員函式的定義)等等。例如:
int j = 24;int main() { int i = j, j; j = 42; }
名字j被聲明了兩次並被使用了兩次。第一個被聲明的j的聲明區域是整個例子程式。第一個j的潛在作用域(potential scope)在這個名字被聲明處之後,並持續至程式的末尾。但第一個j的(實際)作用域應排除逗號,與右花括弧}之間的程式區域。第二個被聲明的j(在分號之前的那個j)的聲明區域是一對花括弧{與}括起來的整個程式區域(也即main函式的函式體),但第二個j的潛在作用域應排除名字i的聲明。第2個j的(實際)作用域與它的潛在作用域相同。
範圍
只能在程式的某些區域內使用C++ 名稱。此區域稱為名稱的“範圍”。範圍決定一個不表示靜態範圍的對象的名稱的“生存期”。在以下情況下,範圍還可決定名稱的可見性:調用類構造函式或析構函式時,或初始化範圍的局部變數時。有五種範圍:局部範圍:塊中聲明的名稱僅在該塊中以及由它封閉的塊中是可訪問的,並且僅在聲明點後可訪問。函式範圍:標籤是具有函式範圍的名稱。它們可以在函式內的任意位置使用,但在函式外部是不可訪問的。檔案範圍:在所有模組或類的外部聲明的任何名稱都具有檔案範圍。類範圍:類成員的名稱具有類範圍。原型範圍:函式原型中聲明的名稱僅在原型的末尾可見。範圍與聲明區域最大區別是:範圍在程式文本的區域中,它是合法的,指的是實體通過其不合格的名稱。程式文本的區域沒有兩個實體被允許具有相同的名稱。例如,在文本區域中,除了M的主體之外,C 的主體不允許包含任何其他名稱為x 的文本。一旦你有一個叫做x的欄位,你就不能擁有另一個欄位,屬性,嵌套類型或者叫做x的事件。
類型
命名空間(Namespace),也稱名字空間、名稱空間等,它表示著一個標識符(identifier)的可見範圍(在C++中,將聲明與定義組合到一個通用聲明區域,稱為命名空間)。一個標識符可在多個名字空間中定義,它在不同名字空間中的含義是互不相干的。這樣,在一個新的名字空間中可定義任何標識符,它們不會與任何已有的標識符發生衝突,因為已有的定義都處於其他名字空間中。
這一特點是使用名字空間的主要理由。在大型的電腦程式或文檔中,往往會出現數百或數千個標識符。名字空間(或類似的方法,見“名字空間的模擬”一節)提供一隱藏區域標識符的機制。通過將邏輯上相關的標識符組織成相應的名字空間,可使整個系統更加模組化。
在程式語言中,名字空間是對作用域的一種特殊的抽象,它包含了處於該作用域內的標識符,且本身也用一個標識符來表示,這樣便將一系列在邏輯上相關的標識符用一個標識符組織了起來。許多現代程式語言都支持名字空間。在一些程式語言(例如C++和Python)中,名字空間本身的標識符也屬於一個外層的名字空間,也即名字空間可以嵌套,構成一個名字空間樹,樹根則是無名的全局名字空間。函式和類的作用域可被視作隱式名字空間,它們和可見性、可訪問性和對象生命周期不可分區的聯繫在一起。
編譯單元,指的是代碼的物理組織形式。根據C++標準,每一個cpp 檔案就是一個編譯單元。
函式體是程式語言中定義一個函式功能的所有代碼組成的整體。函式體是用花括弧括起來的若干語句,他們完成了一個函式的具體功能。函式體內的前面是定義和說明部分,後面是語句部分。函式聲明與函式體放在一起組成了函式定義。
作用域
作用域(scope)是名字(name)與實體(entity)的綁定(binding)保持有效的那部分電腦程式。顯然,這種名字綁定既可以是在編譯時的靜態綁定,也可使程式運行時的動態綁定,所產生的作用域分別稱為靜態作用域與動態作用域。C/C++是典型的靜態綁定的作用域;而Emacs Lisp是典型的動態綁定的作用域。C++語言標準規定:使得特定名字保持有效的那些可能並不連續的程式文本就是該名字的作用域。名字的作用域通常從其聲明之處開始,但要排除內部嵌套的聲明區域中其他同名的名字的作用域