C++ 筆記 namespace 命名空間

1.全局作用域中定義的名字也就是定義在全局命名空間中,全局命名空間以隱式的方式聲明,並且在所有程序中都存在。

int i = 0;
::i;

2.嵌套的命名空間中,內層命名空間聲明的名字將隱藏外層命名空間聲明的同名成員。

外層命名空間中無法直接訪問內層中的名字。

3.C++11中引入了內聯命名空間,內聯命名空間中的名字可以被外層命名空間直接使用。關鍵字inline必須出現在命名空間第一次定義的地方,後續再打開命名空間的時候可以寫inline也可以不寫。

namespace test
{
    inline namespace testex
    {
        int i;
    }

    int j = i;    // 正確
}

4.一條using聲明語句一次只引入命名空間的一個成員,可以出現在全局作用域,局部作用域,命名空間作用域以及類的作用域中,在類的作用域中,這樣的聲明語句只能指向基類成員。using指示和using聲明類似的地方是,我們可以使用命名空間名字的簡寫形式,不同的是,我們無法控制哪些名字是可見的,因爲所以名字都是可見的。using指示也不能出現在類的作用域中。

5.通常情況下,命名空間中會含有一些不能出現在局部作用域中的定義,因此,using指示一般被看作是出現在最近的外層作用域中。但是這也可能會與外層作用域的名字產生衝突,這種衝突時允許存在的。

int j;
namespace myspace
{
    int i, j;
}

void test()
{
    using namespace myspace;    // 把myspace::i注入到全局作用域中
    int i;                        // 覆蓋了全局作用域的i
    j = 0;                        // 二義性
    ::j = 0;                    // 全局作用域的j
    myspace::j = 1;                // myspace的j
}

6.實參相關的查找與類類型形參。下述代碼中,operator>> 函數定義在標準庫string中,string又定義咋命名空間 std 中。但是我們不用std:: 限定符和using 聲明就可以調用operator>>。
原因是,當我們給函數傳遞一個類類型的對象時,除了在常規的作用域查找外還會查找實參類所屬的命名空間。這一例外對於傳遞類的引用或指針的調用同樣有效。

std::string str;
operator >> (std::cin, str);

7.友元聲明與實參相關的查找。當類聲明瞭一個友元時,該友元聲明並沒有使得友元本身可見。

namespace A
{
    class test
    {
        friend void func();                    // 除非另有聲明,否則不會被找到
        friend void func1(const test &t);    // 根據實參相關的查找規則可以被找到
    };
}


int main()
{
    A::test t;
    func();        // 錯誤,func沒有被聲明
    func1(t);    // 正確,通過在A::test中的友元聲明找到A::func1
    return 0;
}

8.uisng聲明語句聲明的是一個名字,而非一個特定的函數,當我們爲函數書寫using聲明時,該函數的所有版本都被引入到當前作用域中。如果using聲明出現在局部作用域中,則引入的名字將隱藏外層作用域的相關聲明,如果using所在的作用域中已經有一個函數與新引入的函數同名且形參列表相同,將引發錯誤。

namespace A
{
    void test(int);
}

using A::test(int);    // 錯誤
using A::test;        // 正確

9.與using聲明不同的是,對於using指示來說,引入一個與已有函數形參列表完全相同的函數並不會產生錯誤。此時只要我們指明調用的是命名空間中的函數版本還是當前作用域的版本即可。

namespace A
{
    void test(int) {}
}

using A::test;

void test(int) {}    // 錯誤
namespace A
{
    void test(int) {}
}

using namespace A;

void test(int) {}    // 正確

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章