• Index

命名空间的调用

Reads: 16

使用命名空间里面的东西时,需要这样写命名空间::需要使用的东西。当然,多重命名空间的使用就是命名空间1::命名空间2::需要使用的东西,以此类推。

释放命名空间

命名空间和需要使用的标识符加起来的名字太长也是经常发生的,在这种情况下,为了可读性,有很多种缩短的方法,首先介绍的是释放命名空间。但是说这个方法前先说明使用原则,这个很重要。

由于命名空间的作用就是为了减少冲突,如果不管什么情况都释放它,那么就失去它的作用了。所以要保证:要限制释放命名空间的范围

下面说如何释放命名空间,都以命名空间std和命名空间std::chrono举例:

基础示例 1

#include <iostream> // std::cout std::endl

int main(void)
{
    // 释放命名空间std后, 后面代码都可以省略std::
    using namespace std;
    cout << "释放命名空间std" << endl;
    return 0;
}

基础讲解 1

可以看出,使用using namespace std;后,释放出命名空间std里面的所有内容,此时,std::coutstd::endl都可以省略std::,而写成coutendl

基础示例 2

#include <iostream> // std::cout std::endl
#include <chrono> // std::chrono::system_clock

int main(void)
{
    auto today = std::chrono::system_clock::now(); // 获取当前时间点对象
    auto time = std::chrono::system_clock::to_time_t(today); // 转换成时间戳
    std::cout << time << std::endl; // 输出当前时间戳

    // 释放命名空间可缩短长度
    using namespace std::chrono;
    auto today1 = system_clock::now();
    auto time1 = system_clock::to_time_t(today1);
    std::cout << time1 << std::endl;

    return 0;
}

基础讲解 2

chrono是标准C++的时间库,std::chrono中的chronostd命名空间里的命名空间,而std::chrono::system_clock是一个数据类型。

函数std::chrono::system_clock::now()可以获取当前时间点的对象,函数std::chrono::system_clock::to_time_t()可以将时间点对象转换成时间戳。

温馨提示时间戳是一个数值,它是计算机中常用的表示时间的方式。

由于std::chrono是命名空间,所以可以使用using namespace来释放命名空间。那么上面的两个函数都可以省略std::chrono::,而写成system_clock::now()和数system_clock::to_time_t()

由于只释放了命名空间std::chrono里的内容而没有释放std里的内容,所以std::coutstd::endl不能省略std::

如果需要同时释放命名空间stdstd::chrono里面的内容,代码可以这样写:

using namespace std;
using namespace std::chrono;

也可以这样写:

using namespace std;
using namespace chrono;

上面的两行代码中,由于先释放了std中的内容,所以代码中可以直接使用chrono,也就是说,using namespace std::chrono;可以写成using namespace chrono;

基础拓展

注意:由于使用方便,很多资料喜欢在全局释放命名空间中的内容,在实际工程中并不推荐。但是推荐在算法等比赛中,将using namespace std;放在全局,这样非常省时间和方便。

由于是为了代码可读性而减短很长的标识符,所以将命名空间内所用东西都释放并不合理。

释放命名空间里的指定内容

基础示例

#include <iostream> // std::cout std::endl

int main(void)
{
    // 释放命名空间std里面的cout
    using std::cout;
    cout << "释放命名空间std" << std::endl;
    return 0;
}

基础讲解

假如我只想释放出std::cout,那么就可以这样写:using std::cout;。这样除了cout不用写std::之外,其他标准库里的东西都要写std::。因此上面代码中cout省略了std::,而std::endl不能省略std::

如果只想释放std::coutstd::endl就可以这样写:using std::cout, std::endl;。(注意:一条语句中using多个命名空间的功能VS2017还没开发出来

命名空间的别名

给命名空间取一个别名也是有效缩短命名空间的方法。

基础示例

#include <iostream> // std::cout std::endl
#include <chrono> // std::chrono::system_clock

int main(void)
{
    namespace sc = std::chrono;
    auto today = sc::system_clock::now();
    auto time = sc::system_clock::to_time_t(today);
    std::cout << time << std::endl;
    return 0;
}

基础讲解

使用以下方式可以为命名空间取别名:

namespace 新命名空间 = 原命名空间;

上面代码中将std::chrono缩短成sc,那么接下来的std::chrono都可以用sc来代替,如:sc::system_clock::now()

数据类型的别名

给数据类型起别名同样也是有效缩短代码的方法。

基础示例

#include <iostream> // std::cout std::endl
#include <chrono> // std::chrono::system_clock

int main(void)
{
    using now_clock = std::chrono::system_clock;
    std::cout << now_clock::to_time_t(now_clock::now()) << std::endl;
    return 0;
}

基础讲解

上面代码中,定义新的类型now_clock以代替std::chrono::system_clock,酱紫后,后面的代码都可以大幅度缩短。

全局内容

假设我们在全局定义类型using test_t = int;,可以直接使用test_t a = test_t();也可以使用::test_t a = ::test_t();,加::说明它是全局的。同理,使用std::cout时,也可以这样写::std::cout,它们是一样的。

显式地写明::的原因:在有些时候,局部的内容会屏蔽掉全局的内容。

补充知识(了解即可)

using std::cout, std::endl;这种是从C++17开始加入。C++11前需要分开写,即写两次using


Comments

Make a comment

  • Index

WARNING: You are using an old browser that does not support HTML5. Please choose a modern browser (Chrome / Microsoft Edge / Firefox / Sarafi) to get a good experience.