命名空間(namespace)詳解

1、爲何使用命名空間ios

考慮一種狀況,當咱們有兩個同名的人,Zara,在同一個班裏。當咱們須要對它們進行區分咱們必須使用一些額外的信息和它們的名字,好比這個區域,若是它們生活在不一樣的區域或者它們的母親或父親的名字,等等。ide

  在您的C++應用程序中也會出現一樣的狀況。例如,您可能正在編寫一些具備名爲xyz()函數的代碼,而且還有另外一個可用的庫,它也具備相同的xyz()函數。如今編譯器沒法知道您在代碼中引用的xyz()函數的哪一個版本。函數

  名稱空間(namespace)被設計來克服這個困難,並被用做額外的信息來區分相似的函數、類、變量等等,它們在不一樣的庫中具備相同的名稱。使用名稱空間,您能夠定義定義名稱的上下文。本質上,名稱空間定義了一個範圍。spa

2、命名空間的定義設計

在C語言中只有一個全局做用域:作用域

1.C語言中全部的全局標識符共享一個做用域
2.標識符之間可能發生衝突
C++中提出了命名空間的概念:編譯器

1.命名空間將全局做用域分紅不一樣的部分,
2.不一樣命名空間中的標識符能夠同名而不會發生衝突
3.命名空間能夠發生嵌套
4.全局做用域也叫默認命名空間
語法:it

namespace Name
{
    namespace Internal
    {
        /*...*/
    }
    /*...*/
}
C++命名空間的使用:io

使用整個命名空間:using namespace name;
使用命名空間中的變量:using name::variable
使用默認命名空間中的變量:  ::variable
Example:編譯

#include <stdio.h>
#include <iostream>
namespace First 
{
    int i = 0;
}
 
namespace Second
{
    int i = 1;
 
    namespace Internal //嵌套命名空間
    {
        struct P  //嵌套命名空間
        {
            int x;
            int y;
        };
    }
}
 
int main()
{
    using namespace First; //使用整個命名空間
    using Second::Internal::P;  //使用嵌套的命名空間
 
    printf("First::i = %d\n", i);
    printf("Second::i = %d\n", Second::i);  //使用命名空間中的變量
 
    P p = { 2, 3 };
 
    printf("p.x = %d\n", p.x);
    printf("p.y = %d\n", p.y);
 
    system("pause");
    return 0;
}
編譯運行,輸出結果:

 3、using指令

  可使用using namespace指令避免使用名稱空間前置。該指令告訴編譯器後續代碼正在使用指定命名空間中的名稱。

Example:

#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;
}
編譯運行,輸出結果:

4、std命名空間

  下列代碼能夠引用cout而不預先添加命名空間:

#include <iostream>
using std::cout;
 
int main () {
   cout << "std::endl is used with std!" << std::endl;
   
   return 0;
}
編譯運行,輸出結果:

<本文完>