复习:C++的命名空间

一、命名空间

1.1、什么是命名空间?

命名空间(namespace)是C++语言特别重要的特性,当第三方供应商提供的库时,为了避免与其他供应商或者用户定义的名字相冲突(命名空间污染),常常将库的内容放置在自己独立的命名空间中。C++标准库也定义了相应命名空间std,用户在使用标准库时必须通过作用域运算符(::),或者使用using关键词来简化命名空间中名字的使用。

1.2、命名空间的实现与使用?

1.2.1、命名空间的用法
  • 支持多个同名namespace分布在不同文件中,编译时合并。
  • 支持namespace的嵌套
1.2.2、代码实现

::是运算符中等级最高的,它分为三种:全局作用域符,类作用域符,命名空间作用域符。
下面的代码来源于《c++ premier》:

namespace blip{
    int i=16,j=15,k=23;
    //其他声明
}
int j =0;                    //正确:blip的j隐藏在命名空间中
void manip()
{
    //using指示,bilp中的名字被“添加”到全局作用域中
    using namespace bilp;    //如果使用了j,则将在::j和bilp::j之间产生冲突
    ++i;                     //将bilp::i设定为17
    ++j;                     //二义性错误:是全局的j还是bilp::j?
    ++::j;                   //正确:将全局的j设定为1
    ++bilp::j;               //正确:将blip::j设定为16
    int k = 97;              //正确:当前局部的k隐藏了bilp::k
    ++k;                     //正确:将当前局部的k设定为98
}

using指示将命名空间bilp中定义的名字仿佛提升到blip的上层空间,而不是manip的局部作用域。这带来问题便是,如果在上层空间中也定义了相同名字的变量,那么对该变量的直接使用会出现错误。这种错误在不使用该变量时完全不报错,也就是说提升的变量与原来的变量名字即使相同,只要不对其直接访问编译便可以正常通过。这带来的结果是,对于某些库有时用到其新特性时才会出现问题,无疑增加了维护的难度。所以在可以的情况下,尽量避免using指示。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值