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) {}    // 正确

 

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