在本章之前看到的程式,都是通過直接說明名字來自 std 命名空間,來引用標準庫中的名字。例如,需要從標準輸入讀取資料時,就用 std::cin。這些名字都用了:: 操作符,該操作符是範圍操作符(第 1.2.2 節)。它的含義是右運算元的名字可以在左運算元的範圍中找到。因此,std::cin 的意思是說所需要名字 cin 是在命名空間 std 中定義的。顯然,通過這種符號引用標準庫名字的方式是非常麻煩的。幸運的是,C++ 提供了更簡潔的方式來使用命名空間成員。本節將介紹一種最安全的機制:using 聲明。關於其他簡化使用命名空間中名字的方法將在第 17.2 節中介紹使用 using 聲明可以在不需要加首碼 namespace_name:: 的情況下訪問命名空間中的名字。using 聲明的形式如下: using namespace::name; 一旦使用了 using 聲明,我們就可以直接引用名字,而不需要再引用該名字的命名空間。
#include <string><br />#include <iostream><br />// using declarations states our intent to use these names from the namespace std<br />using std::cin;<br />using std::string;<br />int main()<br />{<br /> string s; // ok: string is now a synonym for std::string<br /> cin >> s; // ok: cin is now a synonym for std::cin<br /> cout << s; // error: no using declaration; we must use full<br />name<br />std::cout << s; // ok: explicitly use cout from namepsace std<br />}
沒有 using 聲明,而直接使用命名空間中名字的未限定版本是錯誤的,儘管有些編譯器也許無法檢測出這種錯誤。每個名字都需要一個 using 聲明一個 using 聲明一次只能作用於一個命名空間成員。using 聲明可用來明確指定在程式中用到的命名空間中的名字,如果希望使用 std(或其他的命名空間)中的幾個名字,則必須為要用到的每個名字都提供一個 using 聲明。例如,利用 using 聲明可以這樣重新編寫第 1.2.2 節中的加法程式:
#include <iostream><br />// using declarations for names from the standard library<br />using std::cin;<br />using std::cout;<br />using std::endl;<br />int main()<br />{<br />cout << "Enter two numbers:" << endl;<br />int v1, v2;<br />cin >> v1 >> v2;<br />cout << "The sum of " << v1<br /><< " and " << v2<br /><< " is " << v1 + v2 << endl;<br />return 0;<br />}
對 cin,cout 和 endl 進行 using 聲明,就意味著以後可以省首碼 std::,直接使用命名空間中的名字,這樣代碼可以更易讀。從這裡開始,假定本書所有例子中所用到的標準庫中的名字都已提供了 using 聲明。這樣,無論是在文檔還是在代碼執行個體中引用 cin, 我們都不再寫為首碼形式 std::cin,為了使代碼執行個體簡短,我們還省略了編譯時間所必需的 using 聲明。同樣的,程式執行個體也會省略必需的 #include 指示。本書附錄 A 中的表 A.1 列出了本書中用到的標準為名字的庫名和相應的標頭檔。在編譯我們提供的執行個體程式前,讀者一定要注意在程式中添加適當的 #include 和 using 聲明。使用標準庫類型的類定義有一種情況下,必須總是使用完整標準庫名字:在標頭檔中。理由是標頭檔的內容會被前置處理器複製到程式中。用 #include 包含檔案時,相當於標頭檔中的文本將成為我們編寫的檔案的一部分。如果在標頭檔中放置 using 聲明,就相當於在包含該標頭檔 using 的每個程式中都放置了同一 using,不論該程式是否需要 using 聲明。通常,標頭檔中應該只定義確實必要的東西。請養成這個好習慣。