0%

C++之命名空间(namespace)

命名空间(英语:Namespace)表示标识符(identifier)的可见范围。一个标识符可在多个命名空间中定义,它在不同命名空间中的含义是互不相干的。这样,在一个新的命名空间中可定义任何标识符,它们不会与任何已有的标识符发生冲突,因为已有的定义都处于其他命名空间中。

在编程语言中,命名空间是对作用域的一种特殊的抽象,它包含了处于该作用域内的标识符,且本身也用一个标识符来表示,这样便将一系列在逻辑上相关的标识符用一个标识符组织了起来。许多现代编程语言都支持命名空间。在一些编程语言(例如C++和Python)中,命名空间本身的标识符也属于一个外层的命名空间,也即命名空间可以嵌套,构成一个命名空间树,树根则是无名的全局命名空间。

函数和类的作用域可被视作隐式命名空间,它们和可见性、可访问性和对象生命周期不可区分的联系在一起。

[以上摘自维基百科]

命名空间的定义

命名空间的定义跟类相似, 但不需要构造函数, 而且也没有访问限制. 下面的代码定义了一个名为hello的命名空间:

#include <iostream>
namespace hello {
    using namespace std;
    void greeting(){
        cout << "Hello World!" << endl;
    }
    
    class Girl{
    public:
        static void greeting(){
            cout << "Hello beautiful Girl!" << endl;
        }
    };
}

命名空间的使用

一般来说, 命名空间的使用有2种方式.

第一种为使用using语句. 先使用using语句将命名空间打开, 这样就可以直接使用函数名调用命名空间中的方法了.

int main(int argc, const char * argv[]) {
    
    using namespace hello;
    greeting();
    Girl::greeting();

    return 0;
}	

第二种是使用作用域解析运算符::.

int main(int argc, const char * argv[]) {
    hello::greeting();
    hello::Girl::greeting();

    return 0;
}	

命名空间的增补

在开发过程中可以给已存在的命名空间动态增加方法, 但新增加的函数不能与命名空间中已存在的函数重名.

下面的代码给上面定义的命名空间hello增加了一个函数greeting2:

namespace hello {
    using namespace std;

    void greeting2(){
        cout << "Hello Girl!" << endl;
    }
}

命名空间的重命名

如果命名空间的名字非常长, 可以使用如下语句对命名空间进行重命名:

namespace h = hello;

此时, 两个命名空间可以同时使用:

int main(int argc, const char * argv[]) {
    namespace h = hello;
    h::greeting();
    h::greeting2();
    hello::Girl::greeting();

    return 0;
}