c++入門之命名空間存在的意義
看過雞啄米的C++編程入門系列教程的朋友,應該能註意到,在其中的很多實例中,都有這麽一條語句:using namespace std;,即使用命名空間std,其作用就是規定該文件中使用的標準庫函數都是在標準命名空間std中定義的。本文就詳細講解命名空間的意義和用法。
命名空間的意義
為什麽需要將函數定義在命名空間中呢?這其實是為了避免變量或函數重命名的問題。試想,一個項目組內多個工程師進行開發,有可能會出現全局變量或函數重名的現象,而如果每個人都定義了自己的命名空間,就可以解決這個問題,即使重名,只要分屬不同的命名空間就不會引起問題。
這樣大家應該明白了,命名空間就是將多個變量和函數等包含在內,使其不會與命名空間外的任何變量和函數等發生重命名的沖突。
命名空間實例
下面雞啄米給出一個使用命名空間的實例。實例中有兩個命名空間JiZhuoMi和Software,他們中都有一個名為szUrl的字符串,我們試著訪問並輸出這兩個字符串。
C++代碼- #include <iostream>
- using namespace std;
- // 命名空間JiZhuoMi
- namespace JiZhuoMi
- {
- char *szUrl = "www.jizhuomi.com";
- }
- // 命名空間Software
- namespace Software
- {
- char *szUrl = "www.jizhuomi.com/software/";
- }
- int _tmain(int argc, _TCHAR* argv[])
- {
- cout << JiZhuoMi::szUrl << endl; // 輸出命名空間JiZhuoMi中的字符串
- cout << Software::szUrl << endl; // 輸出命名空間Software中的字符串
- return 0;
- }
此實例運行結果如下圖:
我們看到,使用“命名空間::標識符名稱”的方式就可以訪問命名空間中的變量或函數了,而且即使是重復命名也可以正確訪問。
using namespace *;的意義
在上面的實例中,我們訪問命名空間JiZhuoMi和Software中的字符串變量時,都需要在前面加上“命名空間::”,但cout定義在命名空間std中,前面卻不需要加“std::”,這是因為上面這樣一條語句“using namespace std;”。
using namespace *;(這裏的*表示可以是任何命名空間)的作用是釋放命名空間*中的變量或函數等,使之在被訪問時可以不必加“命名空間::”,訪問方法與一般的變量或函數無異,就像上面的cout一樣。
using namespace *;會給我們書寫程序帶來方便,但也要慎用,如果釋放了多個命名空間中的東西後,它們又可能會引起命名沖突。雞啄米給大家演示下同時釋放JiZhuoMi和Software命名空間的情況。
C++代碼- #include <iostream>
- using namespace std;
- // 命名空間JiZhuoMi
- namespace JiZhuoMi
- {
- char *szUrl = "www.jizhuomi.com";
- }
- // 命名空間Software
- namespace Software
- {
- char *szUrl = "www.jizhuomi.com/software/";
- }
- // 釋放命名空間JiZhuoMi和Software
- using namespace JiZhuoMi;
- using namespace Software;
- int _tmain(int argc, _TCHAR* argv[])
- {
- cout << szUrl << endl; // 這裏會提示編譯錯誤
- return 0;
- }
上例中,編譯器會提示編譯錯誤,因為它不知道該訪問哪個命名空間中的字符串變量szUrl。這時要想正確訪問,還需在szUrl前面加上命名空間修飾。
而如果main函數中又定義了一個局部變量szUrl呢?
C++代碼- #include <iostream>
- using namespace std;
- // 命名空間JiZhuoMi
- namespace JiZhuoMi
- {
- char *szUrl = "www.jizhuomi.com";
- }
- // 命名空間Software
- namespace Software
- {
- char *szUrl = "www.jizhuomi.com/software/";
- }
- // 釋放命名空間JiZhuoMi和Software
- using namespace JiZhuoMi;
- using namespace Software;
- int _tmain(int argc, _TCHAR* argv[])
- {
- char *szUrl = "url";
- cout << szUrl << endl;
- return 0;
- }
運行後我們發現,szUrl訪問正確,可見,這種情況下,編譯器優先訪問局部變量。
關於命名空間的內容就講到這裏了,希望大家能夠使用命名空間很好的為軟件開發服務。
c++入門之命名空間存在的意義