应该使用全局函数吗?

时间:2011-05-21 23:17:20

标签: c++ function

请原谅我的基本问题:在C ++中,是否所有函数都在一个类或非全局命名空间内?在什么样的情况下应该写一个全局函数?

2 个答案:

答案 0 :(得分:4)

在类外部定义函数可能对运算符重载(特别是operator<<)或者可能允许使用许多类的模板函数有用,例如:

template <class T>
void
display (T obj)
{
  obj.display ();
}

当然,这没有说明在命名空间内部或外部。命名空间对于防止名称冲突非常有用(例如,名为“download”的函数可以存在于多个库中,因此名称空间非常有用,因为您可以在同一程序中使用libraryX::download ("hello")Nlib::download ("hello"),而无需命名空间编译器将无法选择使用哪个函数)。但是,没有什么能阻止你通过在命名空间之外声明函数来使函数全局化,事实上这很常见。如果您正在创建库,我建议使用命名空间来防止其他库混淆编译器。

答案 1 :(得分:2)

由你决定。如果你来自更严格的面向对象的语言,比如Java,你会发现使用全局函数而不是类方法可能是坏的风格,但是有很多用于全局函数的用例。只需按照您的需要编写代码,C ++对于不同的编程范例和样式非常自由。

如果它应该是语义上的全局函数,那么只需将其设为一个而不是方法或静态方法。具有运算符语义的运算符和普通函数就是一个很好的例子。看看STL算法,为什么它们是全局的?因为它们不属于单个容器。为什么它们不是仅使用静态方法的类的一部分?因为它没有任何优势,而不是让每个人都混淆面向对象的错觉。

编辑:好的,我认为命名空间是另一个故事。当您设计一个库或者您还不知道的其他代码中包含的内容时,将内容打包到命名空间中以避免污染全局命名空间可能总是一个好主意。但至少运营商不应该像我想的那样在命名空间中(但如果我错了就纠正我),否则他们将无法工作using namespace,这大多数时候都是个坏主意。但是在构建独立程序时,实际上不需要自己的命名空间。