1. 程式人生 > >c++入門之命名空間存在的意義

c++入門之命名空間存在的意義

詳細講解 start code ring argv word 多個 load 註意

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

命名空間的意義

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

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

命名空間實例

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

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

此實例運行結果如下圖:

技術分享圖片

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

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. // 命名空間JiZhuoMi
  4. namespace JiZhuoMi
  5. {
  6. char *szUrl = "www.jizhuomi.com";
  7. }
  8. // 命名空間Software
  9. namespace Software
  10. {
  11. char *szUrl = "www.jizhuomi.com/software/";
  12. }
  13. // 釋放命名空間JiZhuoMi和Software
  14. using namespace JiZhuoMi;
  15. using namespace Software;
  16. int _tmain(int argc, _TCHAR* argv[])
  17. {
  18. cout << szUrl << endl; // 這裏會提示編譯錯誤
  19. return 0;
  20. }

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

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

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

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

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

c++入門之命名空間存在的意義