命名空間

2018-08-12 22:03 更新

命名空間

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

同樣的情況會出現(xiàn)在你的 C++ 應用程序中。例如,你可能會編寫一些代碼,有一個名為 xyz() 的函數(shù),在另一個庫中也有同樣的函數(shù) xyz() ?,F(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ù))使用范圍:

    #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;
    }

如果我們編譯和運行上面的代碼,這將產(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;
    }

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

    Inside first_space

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

    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;
    }

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

    std::endl is used with std!

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

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

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

所以,如果命名空間的一部分需要定義在另一個文件中的名字,仍然必須聲明這個名字。定義以下命名空間實現(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;
    }

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

    Inside second_space
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號