C++:什么时候适合在类外定义函数

标签 c++ oop

<分区>

Possible Duplicate:
When should functions be member functions?

在某些情况下,在类外部定义函数会更好还是应该在类内部使用静态函数?

最佳答案

有一些情况必须是非成员函数:

  • 运算符重载不能是静态成员函数(它们可以是非静态成员函数),尤其是大多数二元运算符重载作为非成员函数工作得更好,因为您可以在 LHS 和 RHS 上进行隐式转换用于自由运算符重载,但仅在 RHS 上用于成员运算符重载。

  • std::swap 通常被称为 using std::swap; swap(x,y); 以便类可以通过 ADL“重载”它。因此,按惯例实现 swap 需要一个非成员函数,如果只是作为调用成员函数的包装器的话。其他设计为 ADL 重载的函数也是如此。

  • 从技术上讲,静态成员函数不能具有“C”链接,因此在与其他语言交互时不适合用作回调。实际上,C++ ABI 倾向于使静态函数调用与 C 兼容,当然前提是它们的参数和返回类型存在于 C 中。

到目前为止,我能想到一个必须是静态成员函数而不是自由函数的情况:

  • 您想使用访问说明符 protected。私有(private)静态成员函数通常没有意义,因为通常最好在 .cpp 文件中定义一个带有内部链接的自由函数,其他人甚至看不到它,更不用说调用它了。但我想偶尔你会想要一个。

除此之外,这确实是一个风格问题,静态成员函数和自由函数之间并没有太大的实际区别。

关于C++:什么时候适合在类外定义函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5922409/

相关文章:

python - 尽可能使用对象是 Pythonic 吗?

c++ - 为什么空基类优化(EBO)在MSVC中不起作用?

c++ - 使用 push_back 将 vector<double> 放入 vector<vector<double>>

c++ - 绑定(bind)成员函数的正确方法?

javascript - 有没有办法扩展 ThreeJS 对象?

c# - 子父表 : where I should put the method in 2 class?

c++ - 0xC0000005 多线程动画错误

c++ - 为什么 gcc 会立即销毁我的对象,尽管它的范围? (我如何让它不那样做?)

php - 如何在 Kohana 3 中使用自定义库

c# - 扩展 SqlException 并向其添加属性