c++ 命名空间(Namespace)std

当你采用不同的模块和/或程序库时,经常会出现名称冲突现象,这是因为不同的模块和程序库可能对不同的对象使用相同的标识符(identifier)。Namespace正是用来解决这个问题的。所谓 namespace是指标识符的某种可见范围。和class不同,namespace具有扩展开放性,可发生于任何源码文件上。因此你可以使用一个namespace来定义若干组件,而它们可散布于多个实质模块(physical module)内。这类组件的典型例子就是C++标准库,因为C++标准库使用了一个namespace。
事实上,C++标准库中的所有标识符都被定义于一个名为std的namespace内。C++11还包含由TR1引入、被定义于namespace std::tr1内的所有标识符。此外,namespace posix被保留了,虽然它尚未被C++标准库使用
注意,以下namespace嵌套于std内,被C++标准库使用:
·std::rel_ops(见5.5.3节第138页)std::chrono(见5.7.1节第144页)
·std::placeholders(见6.10.3节第243页)
·std::regex_constants(见14.6节第732页)
·std::this_thread(见18.3.7节第981页)


基于namespace带来的概念,欲使用C++标准库的任何标识符,你有三种选择:
1.直接指定标识符,例如写下std::ostream而不是ostream。完整语句类似这样:
            std::cout << std::hex<<3.4<<std::endl;
2.使用using declaration。例如以下程序片段使我们后续不必写出范围限定符std::便可直接使用cout和end1:
using std::cout;

using std::endl;

于是先前的例子可写成这样:
            cout<<std::hex<<3.4<<endl;
3.使用using directive,这是最简便的选择。如果对namespace std 采用using directive,便可以让std内的所有标识符都有效(曝光),就好像它们被声明为全局符号一样。因此,写下
          using namespace std;

之后,就可以直接这样写:

          cout <<hex<<3.4<<end1;

但请注意,在复杂的代码中,这种方式可能导致意外的名称冲突,更槽的是,由于某些晦涩的重载(overloading)规则甚至导致不一样的行为。如果场合不够明确(例如在头文件中),应避免使用using directive。

来源:

c++ 标准库 2nd

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值