鍍金池/ 教程/ C/ 命名空間
動態(tài)內(nèi)存
類和對象
接口 (抽象類)
結(jié)構(gòu)體
循環(huán)的類型
函數(shù)
數(shù)字
日期和時間
基本語法
多態(tài)
數(shù)據(jù)抽象
注釋
命名空間
字符串
預(yù)處理器
決策語句
修飾符的類型
鍙橀噺綾誨瀷
基本輸入輸出
操作符
數(shù)組
模板
多線程
繼承
Web 編程
信號處理
指針
存儲類型
概述
引用
常量
異常處理
開發(fā)環(huán)境
重載
變量作用域
數(shù)據(jù)類型
數(shù)據(jù)封裝
文件和流

命名空間

考慮一個情況,在同一個班有兩個同名的人,都叫 Zara 。每當(dāng)我們需要區(qū)分他們的時候,除了它們的名字我們肯定會使用一些額外的信息,就像如果他們住在不同的區(qū)域或他們的母親或父親的名字,等等。

同樣的情況會出現(xiàn)在你的 C++ 應(yīng)用程序中。例如,你可能會編寫一些代碼,有一個名為 xyz() 的函數(shù),在另一個庫中也有同樣的函數(shù) xyz() 。現(xiàn)在編譯器不知道在你的代碼中指定的是哪個版本的 xyz() 函數(shù)。

namespace就是用來克服這個困難的,而且作為附加信息來區(qū)分在不同的庫中具有相同名稱的函數(shù),類、變量等。使用命名空間,你可以定義名字已經(jīng)定義的上下文。從本質(zhì)上講,一個命名空間定義了一個范圍。

定義命名空間

一個命名空間的定義由關(guān)鍵字 namespace 加它的名稱組成,如下所示:

    namespace namespace_name {
        // code declarations
    }

調(diào)用任何函數(shù)或變量的命名空間啟用版本,前面加上命名空間名字如下:

    name::code;  // code could be variable or function.

讓我們看看命名空間如何限定實(shí)體(包括變量和函數(shù))使用范圍:

    #include <iostream>
    using namespace std;

    // first name space
    namespace first_space{
       void func(){
      cout << "Inside first_space" << endl;
       }
    }
    // second name space
    namespace second_space{
       void func(){
      cout << "Inside second_space" << endl;
       }
    }
    int main ()
    {

       // Calls function from first name space.
       first_space::func();

       // Calls function from second name space.
       second_space::func(); 

       return 0;
    }

如果我們編譯和運(yùn)行上面的代碼,這將產(chǎn)生以下結(jié)果:

    Inside first_space
    Inside second_space

using 指令

你可以通過使用 using namespace 指令來避免在頭部添加命名空間。這個指令告訴編譯器,隨后代碼要使用指定命名空間中的名稱。因此名稱空間隱含下面的代碼:

    #include <iostream>
    using namespace std;

    // first name space
    namespace first_space{
       void func(){
      cout << "Inside first_space" << endl;
       }
    }
    // second name space
    namespace second_space{
       void func(){
      cout << "Inside second_space" << endl;
       }
    }
    using namespace first_space;
    int main ()
    {

       // This calls function from first name space.
       func();

       return 0;
    }

如果我們編譯和運(yùn)行上面的代碼,這將產(chǎn)生以下結(jié)果:

    Inside first_space

using 指令也可以用來指一個名稱空間中的特定的項目。例如,如果你打算只是用 std 名稱空間的一部分cout,你可以進(jìn)行如下操作:

    using std::cout;

后續(xù)的代碼可以調(diào)用 cout 而不用在前面加上命名空間名字,但命名空間中的其他項目仍需要作如下說明:

    #include <iostream>
    using std::cout;

    int main ()
    {

       cout << "std::endl is used with std!" << std::endl;

       return 0;
    }

如果我們編譯和運(yùn)行上面的代碼,這將產(chǎn)生以下結(jié)果:

    std::endl is used with std!

using 指令引入的名字遵循正常的檢測規(guī)則。這個名字相對于從 using 指令的指針到范圍的結(jié)束是可見的,并且在這個范圍中指令可以被找到。定義在外部范圍的有相同名字的實(shí)體是被隱藏的。

不連續(xù)的命名空間

一個命名空間可以被分別定義為若干個不同部分,因此命名空間是由這些部分的合集組成。這些被分開定義的命名空間可以分散在多個文件中。一個命名空間的分離的部分可以分散在多個文件。

所以,如果命名空間的一部分需要定義在另一個文件中的名字,仍然必須聲明這個名字。定義以下命名空間實(shí)現(xiàn)定義一種新的命名空間或添加新的元素到一個現(xiàn)有的命名空間:

    namespace namespace_name {
       // code declarations
    }

嵌套的命名空間

命名空間可以被嵌套,你可以在一個命名空間內(nèi)定義另一個命名空間,如下:

    namespace namespace_name1 {
       // code declarations
       namespace namespace_name2 {
      // code declarations
       }
    }

在上面的語句中如果你使用的是 namespace name1 ,那么它將使 namespace name2 的元素在整個范圍內(nèi)可用,如下:

    #include <iostream>
    using namespace std;

    // first name space
    namespace first_space{
       void func(){
      cout << "Inside first_space" << endl;
       }
       // second name space
       namespace second_space{
      void func(){
     cout << "Inside second_space" << endl;
      }
       }
    }
    using namespace first_space::second_space;
    int main ()
    {

       // This calls function from second name space.
       func();

       return 0;
    }

如果我們編譯和運(yùn)行上面的代碼,這將產(chǎn)生以下結(jié)果:

    Inside second_space