C++程序中的許多元素都有用來表示它們的名稱(也稱為標識符)。在C++程序中,可以命名的5種元素是:
(1) 函數。函數是自包含的、可執行代碼的命名塊。第8章將詳細討論如何定義函數。
(2) 變量。變量是內存中的指定區域,用於存儲數據項。第2章將論述變量。
(3) 類型。類型是可以存儲的數據種類。例如類型int用於存儲整數。第2章和後續的章節將介紹類型,尤其是第11和12章。
(4) 標簽。標簽提供了表示特定語句的方式。它們很少使用,第4章將詳細介紹。
(5) 命名空間。命名空間是用一個集合名稱標識程序中一組命名項的方式。這聽起來可能讓人混淆,但不必擔心,稍後就介紹命名空間,第10章將詳細論述。
在大多數現代C++編譯器中,名稱只能包含大小寫字母、下劃線和0~9的數字。ANSI標准還允許在名稱中包含通用字符集(Universal Character Set)(稍後介紹)中的字符,但一般不需要這項功能。
名稱必須由允許的字符組成,不要在名稱的中間加上空白字符(空格、制表符等),否則,編譯器就不會把該名稱看做是一個名稱,而是看做兩個名稱,從而導致處理不正確。另一個限制是名稱不能以數字開頭。下面是一些合法的名稱例子:
value2 Mephistopheles BettyMay Earth_weight PI
下面的名稱就不合法:
8Ball Mary-Ann Betty May Earth-weight 2PI
提示:
包含兩個下劃線的名稱,或者以下劃線開頭,後跟一個大寫字母的名稱,是C++標准庫的保留名稱,在程序中不應使用這類名稱。編譯器不會檢查這類名稱,用戶只能在程序出錯時發現有一個沖突的名稱。
我們將在使用名稱時進一步討論它們,第2章討論變量時就開始討論名稱。
命名空間
在上面的簡單C++程序中,有一行代碼沒有解釋。為了理解這行代碼,需要知道什麼是命名空間。為了說明命名空間的含義,下面先討論名稱。上面C++程序中還沒有解釋的代碼行如下:
- using namespace std;
命名空間的名稱有點像姓氏。家庭中的每個成員都有自己的姓名,在大多數家庭中,每個家庭成員都有一個惟一的名字。在Smith家中,有Jack、Jill、Jean和Jonah。在家庭成員之間,用名字來指代每個人。但是,其他家庭的成員可能與Smith家的成員有相同的名字。例如,在Jones家中,其成員的名字是John、Jean、Jeremiah和Jonah。Jeremiah Jones在稱呼Jean時,顯然是指Jean Jones。如果他想指代Smith家中的Jean,就要使用全名Jean Smith。如果不是這兩個家庭的成員,就只能使用每個人的全名來指代他本人,例如Jack Smith或Jonah Jones。
這就是命名空間的作用。命名空間的名稱類似於姓氏。在命名空間內部,可以使用其成員的名字。在命名空間的外部,就只能把某個實體的名字和命名空間的名稱組合起來,表示該命名空間中的實體。命名空間的目的是提供一種機制,使大程序的各個部分中因出現重名而導致沖突的可能性降到最低。一般情況下,一個程序中包含幾個不同的命名空間。
C++標准庫中的實體都是在命名空間std中定義的,所以標准庫中的所有實體名都用std來限定。cout的全名就是std::cout,其中的兩個冒號有一個非常好聽的名稱:范圍解析運算符,稍後詳述。在這個例子中,該運算符把命名空間的名稱std和流的名稱cout分隔開來。
在這個簡單的C++程序中,開頭的using指令表示我們希望在每次引用命名空間std中的元素時,不指定命名空間的名稱。繼續前面的類推,使程序文件成為std家族的一組榮譽成員,就可以只用名字來引用每個成員了。其優點之一是不需要把cout表示為std::cout,這樣程序代碼就更簡單。如果省略using指令,就必須把輸出語句寫為:
- std::cout <"The best place to start is at the beginning";