1. 程式人生 > >深入理解名稱空間【轉】

深入理解名稱空間【轉】

(轉自:https://blog.csdn.net/LF_2016/article/details/51930792?utm_source=blogxgwz1

一、為什麼使用名稱空間
  一個大型的工程往往是由若干個人獨立完成的,不同的人分別完成不同的部分,最後再組合成一個完整的程式。由於各個標頭檔案是由不同的人設計的,有可能在不同的標頭檔案中用了相同的名字來命名所定義的類或函式,這樣在程式中就會出現名字衝突。不僅如此,有可能我們自己定義的名字會與C++庫中的名字發生衝突。
    名字衝突就是在同一個作用域中有兩個或多個同名的實體,為了解決命名衝突 ,C++中引入了名稱空間,所謂名稱空間就是一個可以由使用者自己定義的作用域,在不同的作用域中可以定義相同名字的變數,互不干擾,系統能夠區分它們。

二、什麼是名稱空間
  名稱空間是程式設計者命名的記憶體區域,程式設計者根據需指定一些有名字的空間域,把一些全域性實體分別存放到各個名稱空間中,從而與其他全域性實體分隔開。
  通俗的說,每個名字空間都是一個名字空間域,存放在名字空間域中的全域性實體只在本空間域內有效。名字空間對全域性實體加以域的限制,從而合理的解決命名衝突。
例:
namespace na
{
   int a;
   char c;
}
則 a和c只在na的作用域內有效。

在宣告一個名稱空間時,花括弧內不僅可以包含變數,而且還可以包含以下型別:
變數(可以帶有初始化)
常量
函式(可以是定義或宣告)
結構體

模板
名稱空間(名稱空間可以巢狀定義)


例:
namespace ns1
{
                 int a;
                 char c = 10;
                 void fun();
                 int Add(int a, int b)
                {
                                 return a + b;
                }
                 namespace ns2
                {
                                 int b;
                }
}

注意,如果此時想輸出b,則需要指定外層和內層的名稱空間
cout<<ns1::ns2::b<<endl;

三、使用名稱空間成員的方法
1、在引用名稱空間成員時,要用名稱空間名和作用域解析符對名稱空間成員進行限定,以區別不同的名稱空間中同名識別符號。即  名稱空間名::名稱空間成員名

2、還可以給名稱空間取別名
例:
namespace Television
{...}
namespace Tv=Television;
則Tv就是名稱空間Television的別名,在以後用到Television的地方都可以用Tv進行替換。

3、使用using名稱空間成員名
using後面的名稱空間成員名必須是有名稱空間限制的名字。
例:using ns1::a;
  以上語句表明,在using的作用域內如果使用到ns1中的成員a,則不必再用名稱空間限定。在以後的程式中如果用到a,則隱含的指ns1::a。  using宣告的作用域是從using語句開始,到using所在的作用域結束。要注意,在同一作用域內用using宣告的不同的名稱空間的成員不能有同名的成員,否則會發生重定義。

4、使用using namespace 名稱空間名(慎用)
  第三條介紹的using名稱空間成員名,一次只能宣告一個名稱空間成員,如果一個名稱空間中有多個變數,就需要多次使用using名稱空間成員名。C++中還提供了using namespace 語句來實現一次宣告一個名稱空間內的全部成員。
例如:
using namespace ns1;
  聲明瞭在本作用域中要用到名稱空間ns1中的成員,在使用該名稱空間內的任何成員時都不必使用名稱空間限定。在用using namespace宣告的作用域中,名稱空間ns1的成員好像在全域性域中宣告的一樣,因此不用加命名限定。

4、無名的名稱空間
例:
namespace
{
   void fun();
}

  由於沒有名字,所以其它檔案無法引用,它只能在本檔案的作用域內有效,它的作用域使重無名名稱空間宣告開始到本檔案結束。在本檔案使用無名名稱空間成員時不必用名稱空間限定。其實無名名稱空間和static是同樣的道理,都是隻在本檔案內有效,無法被其它檔案引用。

5、標準名稱空間
  C++庫的所有識別符號都是在一個名為std的名稱空間中定義的,或者說標準標頭檔案(iostream)中的函式、類、物件和類模板是在名稱空間std中定義的。所以在C++程式的一開始,就用using namespace對std進行全域性宣告。