我听说过使用名称空间std;这是不好的做法,我应该直接使用std::cout和std::cin。这是为什么?声明与std命名空间中的某个变量同名的变量是否有风险?


当前回答

这里有一个我在其他答案中都没有找到的观点:只使用一个名称空间。根据大多数答案,命名空间不好的主要原因是,你可能会有冲突的函数名,这会导致一片混乱。但是,如果只使用一个名称空间,则不会发生这种情况。确定您将使用最多的库(可能使用名称空间std;)并坚持使用它。

可以认为它有一个不可见的库前缀-std::vector变成了vector。在我看来,这是两全其美的:一方面,它减少了必须进行的键入(正如名称空间所预期的那样),另一方面,为了清晰和安全,它仍然需要使用前缀。如果有一个函数或对象没有名称空间前缀,那么您知道它来自您声明的一个名称空间。

请记住,如果您决定在全球范围内使用一个,请不要在本地使用其他。这又回到了其他答案,即本地名称空间通常比全局名称空间更有用,因为它们提供了各种便利。

其他回答

在类的头文件中使用名称空间的问题在于,它迫使任何想要使用您的类(通过包括头文件)的人也“使用”(即查看其他名称空间中的所有内容)。

但是,您可以随意在(私有)*.cpp文件中放入using语句。


请注意,有些人不同意我这样说的“感觉自由”,因为尽管cpp文件中的using语句比头文件中的要好(因为它不会影响包含头文件的人),但他们认为这仍然不好(因为根据代码的不同,这可能会使类的实现更难维护)。这个C++超级FAQ条目说,

using指令存在于遗留的C++代码中,用于简化向命名空间的转换,但您可能不应该定期使用它,至少不应该在新的C++代码。

常见问题解答建议了两种选择:

使用声明:使用std::cout;//using声明允许您无条件使用coutcout<<“值:”;只需键入std::std::cout<<“值:”;

一个例子是,使用名称空间std会因为计数的模糊性而引发编译错误,这也是算法库中的一个函数。

#include <iostream>
#include <algorithm>

using namespace std;

int count = 1;
int main() {
    cout << count << endl;
}

根据我的经验,如果你有多个库使用cout,但出于不同的目的,你可能会使用错误的cout。

例如,如果我键入,使用名称空间std;并使用命名空间otherlib;如果只键入cout(恰好两者都有),而不是std::cout(或'otherlib::cout'),则可能会使用错误的一个,并出现错误。使用std::cout更有效。

这都是关于管理复杂性的。使用名称空间会将您不想要的东西拉进来,因此可能会使调试变得更困难(我说可能)。到处使用std::很难阅读(更多的文本等等)。

马的课程-管理你的复杂性,尽你最大的能力和感觉。

这取决于它的位置。如果它是一个公共的头,那么通过将其合并到全局名称空间中,可以减小名称空间的值。请记住,这可能是制作模块全局的一种简单方法。