声明字符串流ss之间的区别;和std :: stringstream ss;在C ++中?

时间:2013-12-02 20:09:01

标签: c++

我对C ++比较陌生,我有一个简单的问题。假设我想声明一个stringstream对象或任何其他对象。使用完全限定名称std::stringstream并将对象声明为stringstream是否有任何区别?我已经看到它在代码示例中完成了两种方式。

正如我所说,我对C ++很陌生,所以我想要一些澄清。谢谢!

3 个答案:

答案 0 :(得分:5)

不同之处在于,除非你做过像using namespace std;这样可恶的事情,否则前者会编译而后者则不会。

答案 1 :(得分:2)

不同之处在于仅使用stringstream表示您拥有using namespace std;using std::stringstream。没有其中之一,没有完全限定名称的代码将无法编译。

using namespace std通常被认为是一种不好的做法,因为它消除了从C ++命名空间中获得的所有好处 - 即名称冲突。如果您使用using指令,特别是STD,它具有listiterator等类,您可以打开与自己的类名称冲突的可能性。

在最好的情况下,这可能导致奇怪的编译时错误,或者在最坏的情况下,会调用您调用的函数的静默替换,并且难以跟踪问题。

答案 2 :(得分:0)

std::stringstream是指标准库stringstream中找到的众多对象之一。如果我们将图书馆视为物理图书馆建筑,那么您的程序必须去“获取书籍”stringstream才能使用它。这就是std::语法的作用,它向程序表明它必须转到标准库以获取::右侧的任何内容。这适用于许多库,例如boost::或甚至像std::tr1::这样的子命名空间。 (请注意,技术上名称空间不等于库,但我们会忽略它)

现在,通过编写简单的stringstream而不使用std::,它意味着某处using namespace std;已被写入。使用我们之前的类比,using namespace std;基本上将所有这些图书馆书籍混合到您的程序中。你不再需要它们了,但是你的程序现在变得杂乱无章。当然,如果您使用多个库,这可能会导致问题,因为现在std::的一本书可能会与boost::的书混淆。