Some Notes

Be HardWorking Every Day.

命名空间

C++命名空间的概念

在同一个作用域中,不同的数据不能起同一个名字,但是C++命名空间概念的出现,提供了解决问题的方案。在不同的命名空间中,可以随意定义相同的名字。命名空间就是为了避免你包含的头文件中与你自己定义的任意类,数据,函数重名,造成令人迷惑的错误而产生的。

定义命名空间

我们可以自己定义一个命名空间,并且使用它。定义命名空间使用 namespace 关键字,使用命名空间使用 namespace::subject 使用命名空间中的函数,数据等。例如:

#include <stdio.h> // 方便演示,使用了C头文件

namespace mylib
{
    int a = 1, b = 2, c = 3 ;
    void hello()
    {
        printf("Hello World!\n") ;
    }
}
namespace libbb
{
    int a = 10, b = 20, c = 30 ;
    void hello()
    {
        printf("HELLO WORLD!!!!\n") ;
    }
}

int main()
{
    printf("%d %d %d\n", mylib::a, mylib::b, mylib::c) ;
    printf("%d %d %d\n", libbb::a, libbb::b, libbb::c) ;
    mylib::hello() ;
    libbb::hello() ;
    
    return 0 ;
}

输出 1 2 3\n 10 20 30\n Hello World!\n HELLO WORLD!!!!\n。在命名空间 $mylib$ 和 $libbb$ 中,三个变量和一个函数的名字相同,但是所调用的命名空间不同,结果也不一样。

在C++中,大部分函数都在命名空间 $std$ 中,全称 $stdandard$ 。

using使用命名空间

在上段程序中,我们可以在包含头文件后加入几句:

using namespace mylib ;

这样 $mylib$ 命名空间里的 $a ~ b ~ c ~ hello()$ 可以直接写为它原本的样子,不用加上 mylib:: 。这很方便。但是这种方法也有他的局限性,比如我再加入一句:

using libbb::a ;

这样 $libbb$ 命名空间里的 $a$ 使用时也不用加上 libbb:: 了。但是再次出现了两个同样的 $a$ ,谁也分不清使用的到底是 $mylib$ 命名空间里的 $a$ 还是 $libbb$ 命名空间里的 $a$ ,因此会引发错误,这也是 using 的弊端。但是有时候只会用到一个命名空间里的东西时,就比如 $std$ ,就可以直接加上一句 using namespace std ; 这样子更方便,省的 cin 也要 std::string 也要 std