用"using"引用特定项目是否是一种好的做法?
Is it a good practice to refer to a particular item with "using"?
例如,我知道我只需要代码中 std 命名空间中的"cout",所以我将其称为:
using std::cout;
所以我可以自由地使用它作为:
cout << "Using namespaces like a boss!" << std::endl;
而不是将整个命名空间带到我的代码中。
我非常习惯于键入所有前缀 std 的内容,因为我被告知使用命名空间是一种不好的做法,因为它可以与其他命名空间中的其他函数交叉(幸运的是,对我来说并非如此,我仍在学习编码,我在职业生涯的第二学期(,但不是在所有内容前面加上 std, 我想做"使用 std::cout"和其他类似的事情,这样我就可以提高代码的可读性,这对我以后在某个时间点理解我的代码很重要。
事物标记为"不良做法"以代替讨论真正的问题和权衡是一种不好的做法。
有些技术可能很糟糕,经常被滥用。using
,尤其是using namespace
指令可能会被滥用,所以千篇一律的心态就是说它们在某种程度上是"坏的"。
在单个.cpp文件中,您可以更好地控制命名空间,因此只要冲突的机会是可管理的并且可读性有所提高,就可以在文件范围甚至using namespace my_funny_namespace
using std::cout
。在某些时候,也许如果.cpp文件变得复杂,您将面临以下风险:将新名称添加到与您的名称之一冲突some_funny_namespace
中,并且using namespace some_funny_namespace
会带来会破坏代码的内容。但对于像 boost 或 std 这样稳定的东西,这可能不太可能。
还可以按函数在本地使用using
。但是,如果文件中的大多数函数需要相同的声明,则 D.R.Y.
当你在标题中使用其中任何一个时,它可以越界变成一件非常糟糕的事情。然后,您将名称从另一个命名空间泄漏到包含标头的每个文件中。请参阅此精彩答案以获取替代方案和讨论。这真的很糟糕,因为当包含或不包含标头会导致一些完全不相关的问题出现或消失时,它可能会导致幽灵般的远距离操作错误。而且可能破坏的不仅仅是"你的"代码,它可能会破坏其他人使用你的标题的代码。
不要将名称泄漏到其他命名空间中
那么using
,尤其是标题中的using namespace
是verbotten?如果标头在一组选定的.cpp文件中供内部使用怎么办?然后,也许没关系。这就是千篇一律的规则的问题,总有一个例外,无缘无故地让一些假设的事情变得更糟,但最佳实践是可怕的。
using
的好处是可读性(不应被低估(。
缺点是名称冲突的可能性,尤其是在其他一些随机代码中不可预测的名称冲突。
明智地选择。仔细考虑设计的各个方面是一种很好的做法。
(问好问题也不算太糟糕(。
using
namespace
::
identifier
;
是语言的一部分,因为在某些程序中它很有帮助。 您正在平衡简洁性和灵活性与脆弱性,但可能发生的最坏情况是,您必须通过消除您指的是哪个cout
对象的歧义来解决编译器错误。 如果您只是使用大型命名空间中的少数标识符,则具有目标using
语句通常是一个合理的折衷方案;如果列表开始变得过大,那么using namespace std;
可能会变得更容易。
两者都不应该在库头文件的文件范围内使用,因为它们会对翻译单元的其余部分保持影响,并破坏客户端程序。
在限制范围内,在实现文件(.cpp
、.cc
或你使用的任何扩展名(中,你基本上可以尝试using
并根据需要修复歧义 - 你将了解什么最适合你。
using std::begin;
和using std::end;
是特别有用的using
语句的很好的例子,因为它们允许begin(my_container)
在后者对my_container
有重载时匹配std::begin()
,但如果my_container
的begin
实际上在容器声明的任何命名空间中,由于参数依赖查找,begin()
仍然可以匹配。
提示:通常最好写[std::]cout << "Using namespaces like a boss!n";
- 更简洁,为什么要强制刷新? 它往往会降低性能,并且cout
与cin
相关联,因此在需要时会进行刷新以提示用户输入。
- 有没有一种方法可以从函数中返回一个新对象或对现有对象的引用
- 返回对私有向量成员元素的非常量引用是否是一种不好的做法
- 从 r 值引用限定方法返回 r 值引用是否是一种好的做法?
- 是否有一种方法可以将C 类成员引用到向量而不明确添加它们
- 多态变体,并将一种类型的引用绑定到另一种类型的引用
- 有没有一种方法可以将左值和右值的列表分别转换为具有引用类型和完整类型的元组
- 一种比函数引用更有效的方法
- 有没有一种方法可以传入对对象的流引用
- 有没有一种方法可以使用引用而不是指针来处理相互包含数据的类
- 以这种方式返回对新创建的对象的引用,这是一种安全的做法
- 重载一个函数同时获取指针或引用是不是一种糟糕的做法
- 使用类型"bool"类型的值初始化类型"int &"(非常量限定)的引用是否是一种黑客?
- 当您将引用返回到局部变量时,它是否是一种未定义的行为
- 让子对象引用其父对象而不是指针,这是不是一种糟糕的做法
- 用"using"引用特定项目是否是一种好的做法?
- 如何使用数组通过引用对对象进行排序?(以一种不那么愚蠢/复杂的方式.)
- 有没有一种方法可以编写一个以l-val引用或r-val引用为输入参数的函数
- 将函数返回的共享指针绑定到常量的左值引用是否是一种好的做法
- 是否有一种方法可以通过引用来防止lambda捕获
- Is通过引用传递是作为指针传递的一种特殊情况