看過雞啄米的C++編程入門系列教程的朋友,應該能注意到,在其中的很多實例中,都有這么一條語句:using namespace std;,即使用命名空間std,其作用就是規定該文件中使用的標準庫函數都是在標準命名空間std中定義的。本文就詳細講解命名空間的意義和用法。

       命名空間的意義

       為什么需要將函數定義在命名空間中呢?這其實是為了避免變量或函數重命名的問題。試想,一個項目組內多個工程師進行開發,有可能會出現全局變量或函數重名的現象,而如果每個人都定義了自己的命名空間,就可以解決這個問題,即使重名,只要分屬不同的命名空間就不會引起問題。

       這樣大家應該明白了,命名空間就是將多個變量和函數等包含在內,使其不會與命名空間外的任何變量和函數等發生重命名的沖突。

       命名空間實例

       下面雞啄米給出一個使用命名空間的實例。實例中有兩個命名空間JiZhuoMi和Software,他們中都有一個名為szUrl的字符串,我們試著訪問并輸出這兩個字符串。

C++代碼
  1. #include <iostream>  
  2. using namespace std;  
  3.   
  4. // 命名空間JiZhuoMi  
  5. namespace JiZhuoMi  
  6. {  
  7.     char *szUrl = "www.cpbsu.com";  
  8. }  
  9.   
  10. // 命名空間Software  
  11. namespace Software  
  12. {  
  13.     char *szUrl = "www.cpbsu.com/software/";  
  14. }  
  15.   
  16. int _tmain(int argc, _TCHAR* argv[])  
  17. {  
  18.     cout << JiZhuoMi::szUrl << endl;  // 輸出命名空間JiZhuoMi中的字符串  
  19.     cout << Software::szUrl << endl;  // 輸出命名空間Software中的字符串  
  20.     return 0;  
  21. }  

       此實例運行結果如下圖:

詳解C++中命名空間的意義和用法

       我們看到,使用“命名空間::標識符名稱”的方式就可以訪問命名空間中的變量或函數了,而且即使是重復命名也可以正確訪問。

       using namespace *;的意義

       在上面的實例中,我們訪問命名空間JiZhuoMi和Software中的字符串變量時,都需要在前面加上“命名空間::”,但cout定義在命名空間std中,前面卻不需要加“std::”,這是因為上面這樣一條語句“using namespace std;”。

       using namespace *;(這里的*表示可以是任何命名空間)的作用是釋放命名空間*中的變量或函數等,使之在被訪問時可以不必加“命名空間::”,訪問方法與一般的變量或函數無異,就像上面的cout一樣。

       using namespace *;會給我們書寫程序帶來方便,但也要慎用,如果釋放了多個命名空間中的東西后,它們又可能會引起命名沖突。雞啄米給大家演示下同時釋放JiZhuoMi和Software命名空間的情況。

C++代碼
  1. #include <iostream>  
  2. using namespace std;  
  3.   
  4. // 命名空間JiZhuoMi  
  5. namespace JiZhuoMi  
  6. {  
  7.     char *szUrl = "www.cpbsu.com";  
  8. }  
  9.   
  10. // 命名空間Software  
  11. namespace Software  
  12. {  
  13.     char *szUrl = "www.cpbsu.com/software/";  
  14. }  
  15.   
  16. // 釋放命名空間JiZhuoMi和Software  
  17. using namespace JiZhuoMi;  
  18. using namespace Software;  
  19.   
  20. int _tmain(int argc, _TCHAR* argv[])  
  21. {  
  22.     cout << szUrl << endl;    // 這里會提示編譯錯誤   
  23.     return 0;  
  24. }  

       上例中,編譯器會提示編譯錯誤,因為它不知道該訪問哪個命名空間中的字符串變量szUrl。這時要想正確訪問,還需在szUrl前面加上命名空間修飾。

       而如果main函數中又定義了一個局部變量szUrl呢?

C++代碼
  1. #include <iostream>  
  2. using namespace std;  
  3.   
  4. // 命名空間JiZhuoMi  
  5. namespace JiZhuoMi  
  6. {  
  7.     char *szUrl = "www.cpbsu.com";  
  8. }  
  9.   
  10. // 命名空間Software  
  11. namespace Software  
  12. {  
  13.     char *szUrl = "www.cpbsu.com/software/";  
  14. }  
  15.   
  16. // 釋放命名空間JiZhuoMi和Software  
  17. using namespace JiZhuoMi;  
  18. using namespace Software;  
  19.   
  20. int _tmain(int argc, _TCHAR* argv[])  
  21. {  
  22.     char *szUrl = "url";  
  23.     cout << szUrl << endl;  
  24.     return 0;  
  25. }  

       運行后我們發現,szUrl訪問正確,可見,這種情況下,編譯器優先訪問局部變量。

       關于命名空間的內容就講到這里了,希望大家能夠使用命名空間很好的為軟件開發服務。

除非特別注明,雞啄米文章均為原創
轉載請標明本文地址:http://www.cpbsu.com/software/289.html
2013年1月13日
作者:雞啄米 分類:軟件開發 瀏覽: 評論:8