总结: 名字空间

在做项目的时候,遇到了一个这样的问题,下边举了一个小例子来模拟一下:

 

可能读没有遇到过类似的问题,如果你知道,你就不需要往下看了。如果你还不清楚上边代码有什么问题,那么请继续;

      C++鼓励我们使用名字空间,名字空间有助于组织程序中使用的标示符,避免名字冲突。但是对于名字空间的使用,C++新手还是有使用不当的时候。

      可能你会反驳,名字空间有什么难的,不就是个namespace {}; 还有个using namespace  ..;吗?那么如果你这样理解的话,那么请你找出上边代码的问题。

      现在,我来告诉你上边代码的问题所在。在std名字空间中,有一个transform的标示符,而我们的main函数中需要使用的是STL的transform,这两个函数虽然名字相同,但是却是不同的定义。

      而我们在test.h中使用了using namespace std;  我们在main.cpp中包含了test.h,相当于我们在main函数中也使用了using namespace std;。而我们使用的transform函数确不属于这个名字空间。也就是说,在main函数中不能直接使用using namespace std;导出std名字空间中的所有名称,这样做不符合名字空间的设计初衷。而在很多C++的教材中,大部分的案例都是采用了using namespace std;.这样给初学者造成了一个感性的错误认识。

      那么我们应该怎么做呢?

     1.最好不要在头文件中使用using namespace std;

     2.在源文件中可以使用,但是不建议导出所有的名称。用那些就导出哪些;

     3.可以自己定义一个名字空间,把我们常使用的名称放在里边;

       如:

namespace mystd
{
    using std::cout;
    using std::cin;
    using std::string;
    using std::stringstream;
    using std::fstream;
    using std::vector;
    ...
}

 

如果调用的时候 ,直接应用using namespacet mystd;

可以根据需要随时修改名字空间的内容。这样就避免了每次都要导出需要的名称的问题。

 

那么文章开始的程序的正确代码如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值