1. 程式人生 > >c++名稱空間 (c++ primer plus 筆記)

c++名稱空間 (c++ primer plus 筆記)

枚舉 嵌套 另一個 常量 函數 rim 包含 外部 文件的

c++名稱空間

  1. 名稱空間術語
  2. 新的名稱空間特性
  3. 名稱空間的使用理念

  1. 名稱空間術語
    c++中的名稱包括:變量、函數、結構、枚舉、類以及類和結構的成員。
    名稱空間作用:當程序項目越來越大時,c++中的名稱沖突可能性將會增加,名稱空間的出現即為了解決c++中名稱沖突問題。
    聲明區域:是可以在其中進行聲明的區域。例如,全局變量其聲明區域為其聲明所在的文件,局部變量其聲明區域為其聲明所在的代碼塊。
    潛在作用域:變量的潛在作用域從聲明點開始,到其聲明區域的結尾。因此潛在作用域比聲明區域小,這是由於變量必須在定義後才能使用。但聲明區域中的變量並非在潛在作用域的任何位置都是可見的,它可能被別一個在嵌套聲明區域中聲明的同名變量隱藏。
  2. 新的名稱空間特性
    名稱空間作用:
    c++新增了一種功能,即通過定義一種新的聲明區域來創建命名的名稱空間,這樣做的目的之一是提供一個聲明名稱的區域。一個名稱空間中的名稱不會與另外一個名稱相同名稱發生沖突,同時允許程序的其他部分使用該名稱聲明的東西。
    創建名稱空間關鍵字namespace,語法格式如下:

    namespace name {
    int value;
    void func();
    }
  • 名稱空間可以是全局的,也可以位於另一個名稱空間中,但不能位於代碼塊中。
  • 名稱空間中聲明的名稱的鏈接性為外部的,除非它引用了常量。
  • 全局名稱空間對應於文件級聲明區域,全局變量位於全局名稱空間中。
  • 名稱空間中的聲明和定義規則同全局聲明和定義規則相同。
  • 名稱空間是開放的,可以把名稱加入到已有的名稱空間中。語法格式如下:

    namespace name  {
    double value2;
    }

    為名稱空間中的函數原型提供定義的語法格式如下:如下:如下(可在 該文件後面或另一個文件中提供定義):

    namespace name {
    void func() {
    ....
    }
    }

    訪問名稱空間:未被裝飾的名稱稱為未限定的名稱;包含名稱空間的名稱稱為限定的名稱。
    使用解析運算符訪問名稱:

    name::value = 100;

    使用using聲明和using編譯指令簡化對名稱空間的訪問:

    using name::value;
    using namespace name;
  • using聲明將特定的名稱添加到它所屬的聲明區域後,便可以使用value代替name::value,以簡化代碼。
  • 關鍵字using namespace使名稱空間中的所有名稱都可用,而不需要使用域解析運算符。
  • 在全局聲明區域中使用using編譯指令,將使該名稱空間的名稱全局可用。
  • 使用域解析運算符可避免名稱二義性,using聲明和using編譯指令,可能導致名稱二義性。
  • 如果名稱空間和聲明區域定義了相同的名稱,則不能用using聲明導入名稱空間,這樣會導致名稱沖突,編譯器不允許這樣做。但可以用using編譯指令導入名稱空間,此時只是局部名稱隱藏了名稱空間名,用域解析運算符就可以訪問了。
    using聲明比using編譯指令更安全,因為如果有名稱與局部名稱發生沖突,編譯器會發出指示,而後者不會發出警告。
    名稱空間嵌套

    namespace name1 {
    namespace name2 {
        int value2;
    }
    int value1;
    }

    訪問value2的方法:

    using name1::name2::value2;
    value2 = 100;
    using namespace name1::name2;
    value2 = 100;
    using namespace name1;   
    name2::value2 = 100;
  • using編譯指令是可以傳遞的,即嵌套的名稱空間會一起被導入。
  • 創建名稱空間別名:namespace alias_name = name;可以用來簡化對嵌套名稱空間的使用。
  • 未命名的名稱空間:可以通過省略名稱空間的名稱來創建未命令的名稱空間。就像後面跟著using編譯指令一樣,也就是說,在該名稱空間中聲明的名稱的潛在作用域為:從聲明點開始到該聲明區域的末尾。不能在未命名名稱空間所屬文件之外使用名稱空間中的名稱,即提供了鏈接性為內部的靜態變量的替代品。

3.名稱空間的使用理念

  • 使用在已命名的名稱空間中聲明的變量,而不是使用外部全局變量。
  • 使用在已命名的名稱空間中聲明的變量,而不是使用靜態全局變量。
  • 如果開發一個函數庫或類庫,將其放在一個名稱空間中。例如c++提倡將標準函數庫放在名稱空間std中。
  • 僅將編譯指令using作為一種將舊代碼轉換為使用名稱空間的權宜之計。
  • 不要在頭文件中使用using編譯指令。首先,這樣做掩蓋了要讓哪些名稱可用;另外,包含頭文件的順序可能影響程序的行為。如果非要使用,應將其放在所有預處理器編譯指令#include之後。
  • 導入名稱時,首先使用作用域解析運算符或using聲明方法。
  • 對於using聲明,首先將其作用域設置為局部而不是全局。

c++名稱空間 (c++ primer plus 筆記)