名称空间std的奇怪案例

时间:2015-02-12 05:42:59

标签: c++

不可否认,我是C ++的新手,我正在努力学习不同的新东西。

请解释using namespace std

的情况

我的意思是,有些人一直使用std::cinstd::string之类的内容,而不是键入using namespace std,只需使用cinstring向前。有没有什么好理由让他们通过挤奶你知道什么是std ::?

他们做了这么看似愚蠢的事情

3 个答案:

答案 0 :(得分:2)

using namespace std;可以被使用和滥用,就像大多数其他东西一样。

你应该记住的一条规则是

  • 永远不要在标题中的全局命名空间中放置using namespace std;

这是因为像distance这样的名字很容易与客户代码发生冲突。

通常,C ++命名空间的优点是它们允许在名称冲突的情况下轻松消除歧义,同时通常允许您使用可读的非限定名称。如果一个人总是对名字进行限定,那么与C风格的固定前缀和后缀的唯一区别就在于::的存在,并且我认为可以认为在名称中使用这些冒号是有利的。但是这个参数只适用于自己定义的命名空间:对于std命名空间,可以认为它是由标准强加的,因此完全限定名称的实践意味着始终使用std::(和我知道这是由许多公司完成的,尽管我强烈反对这些程序员声称代码然后更多可读而没有std::前缀)。

答案 1 :(得分:0)

这根本不是一个愚蠢的问题。

iostream是一个C ++代码文件(更具体地说是一个头文件,但这并不重要)。它包含定义cout,cin,endl等的代码。如果我们想要使用它们,我们需要它们在我们的代码中,这就是我们包含它的原因。但是,如果我们看一下它的内容,我们将(示意性地)看到这样的东西(这不是一个尝试映射iostream的严肃尝试,但我会避免使事情太复杂,并且为了解释,它会做):

// iostream header file    
    namespace std
    {
       ostream cout;
       istream  cin;
       // etc etc
    };

使用using关键字并不意味着我们添加功能,这意味着我们说我们默认读取内容。如果我们说使用namespace std;然后我们说:如果我们遇到当前命名空间中不存在的OBJECT名称,请检查是否存在它确实存在的命名空间std,并使用该对象。因此,它并没有真正添加一个函数,它是“加载”cout,cin,endl和所有类似的包含。

(请注意,上面的示意图不是打开iostream文件时会发现的,实际上它更复杂,并且包含很多定义。)

教程页面提供了一个很好的解释http://www.cplusplus.com/doc/tutorial/namespaces/

答案 2 :(得分:0)

命名空间是一种构造程序的方法,假设你有自己的字符串类,它放在命名空间foo中。如果没有显式输入std:string,编译器会混淆应该使用哪个字符串。