namespace的说明与指示

namespcae说明


一次只引入命名空间的一个成员(using std::cout)
别的同名实体将被隐藏,可不用头部直接使用cout

namespace指示


一次引入整个命名空间(using namespace std)
即使是在函数内部使用也依旧好像在全局变量的位置一样,我理解的是这种描述的“效力”没有那么强(下面的例子可以说明)

示例


#include <iostream>
#include <string>
using std::cout;
using std::endl;

namespace blip{
    int i=16, j=15, k=23;
    //其他声明
}

int j = 0; //正确,blip的j隐藏在命名空间中
void f();

int main(){
    using namespace blip;
    //using blip::j;

    cout<<i<<endl;
    //cout<<j<<endl;  //会在编译的时候出问题,必须注释掉
    cout<<::j<<endl;
    cout<<blip::j<<endl;
    int k=9;
    cout<<k<<endl;
    f();

    return 0;
}

void f(){
    cout<<j<<endl;
}

输出:
16
0
15
9
0

可以看到,当我们用using指示一次引入整个命名空间的时候,我们有一处注释掉的代码。因为在这里引入变量 j会有命名冲突发生,从而引发编译错误,使用时依旧需要将名字空间加在 j前面,就好像这个是在全局中写的一样。当然,我们可以看到 f()中的 j依旧是0没有冲突,也就是对别的函数不造成影响,只对main()函数好像是写在全局。


#include <iostream>
#include <string>
using std::cout;
using std::endl;

namespace blip{
    int i=16, j=15, k=23;
    //其他声明
}

int j = 0; //正确,blip的j隐藏在命名空间中
void f();

int main(){
    //using namespace blip;
    using blip::j;

    cout<<i<<endl;
    cout<<j<<endl;
    cout<<::j<<endl;
    cout<<blip::j<<endl;
    int k=9;
    cout<<k<<endl;
    f();

    return 0;
}

void f(){
    cout<<j<<endl;
}

输出:
16
0
15
9
0

而在这种情况下,用using声明就能够屏蔽外部的全局变量,做到直接使用blip中定义的 j,同时 f()中的全局变量 j依旧没有影响。

总结


总的来说就是using指示引入的名字“效力”没有那么强,这点我估计是考虑到很多处使用using指示的时候由于引入的名称太多,编译器会不方便判断而统一处理的一种策略。所以在这里也告诉我们在大型项目中要尽量谨慎的使用using指示,预防错误的出现。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值