2. 名字空间的使用

我们声明了两个名字空间 english_envchinese_env 内部都分别定义一个变量 mystr 和 一个函数 say_hello

这个两个变量和两个函数同普通的全局变量和函数不同,它们是定义在名字空间内的标识符,在使用时需要手动指定名字空间的名称。下面我们来说一下如何使用这些变量和函数。

2.1 使用作用域限定符(::

语法:

名字空间名::标识符

示例:

// 访问变量
std::cout << english_env::mystr << std::endl;
std::cout << chinese_env::mystr << std::endl;

// 调用函数
chinese_env::say_hello("魏老师");
english_env::say_hello("魏老师");

2.2 使用 using 声明(引入单个成员)

使用 using 关键字可以将名字空间中的一个标识符声明成为本地的标识符,然后就可以像使用全局变量一样使用这个标识符了。

语法:

using 名字空间名::标识符;

示例:

// 声明 english_env 空间内的  mystr 为当前作用域内的变量。
using english_env::mystr;
// 声明 chinese_env 空间内的  say_hello 函数为当前作用域内。
using chinese_env::say_hello;

// 访问 english_env::mystr 变量
std::cout << mystr << std::endl;
// 调用函数
say_hello("魏老师");

2.3 使用 using namespace 指令(引入整个名字空间的标识符)

上述做法仅仅在使用该名字空间内少量的标识符的时候比较方便。当某个名字空间内有大量的标识符声明,并都会频繁的使用时,则我们可以使用 using namespace 指令将该名字空间内的所有标识符导入到当前声明的作用域内。此时在当前作用域内使用该名字空间内的任何标识符都不需要指定名字空间名。

语法:

using namespace 名字空间名;

示例:

// 声明 chinese_env 内的所有标识符到当前作用域内。
using namespace chinese_env;

// 使用其中的标识符
std::cout << mystr << std::endl;
say_hello("老魏");

完整的可运行的示例代码:

#include <iostream>

// 定义英文运行环境的名字空间
namespace english_env {
    const char * mystr = "Hello";
    void say_hello(const char * name) {
        std::cout << mystr <<" "<< name <<std::endl;
    }
}

// 定义中文运行环境的名字空间
namespace chinese_env {
    const char * mystr = "你好";
    void say_hello(const char * name) {
        std::cout << mystr <<" "<< name <<std::endl;
    }
}

int main(int argc, char * argv[]) {
    // 访问变量
    std::cout << english_env::mystr << std::endl;
    std::cout << chinese_env::mystr << std::endl;

    // 调用函数
    chinese_env::say_hello("魏老师");
    english_env::say_hello("魏老师");

    // 声明 english_env 空间内的  mystr 为当前作用域内的变量。
    using english_env::mystr;
    // 声明 chinese_env 空间内的  say_hello 函数为当前作用域内。
    using chinese_env::say_hello;

    // 访问 english_env::mystr 变量
    std::cout << mystr << std::endl;
    // 调用函数
    say_hello("魏老师");

    // 声明 chinese_env 内的所有标识符到当前作用域内。
    using namespace chinese_env;

    // 使用其中的标识符
    std::cout << mystr << std::endl;
    say_hello("老魏");

    return 0;
}

实验

改写之前的 hello.cpp,使用 using namespace std; 将 std 名字空间内的所有标识符声明到 main 函数中,在将 原来的 std::cout << "Hello World!" << std::endl; 改写成 cout << "Hello World!" << endl; 看能否编译通过并查看运行结果。

可以参照如下代码进行改写:

#include <iostream>

using namespace std;

int main(int argc, char * argv[]) {
    cout << "Hello World!" << endl;
    return 0;
}