C++:何时适合在类之外定义函数
C++: When is it appropriate to define functions outside of a class
可能的重复项:
函数何时应成为成员函数?
是否存在最好在类外定义函数的情况,或者是否应该在类内使用静态函数?
在某些情况下,必须是非成员函数:
- 运算符重载不能是静态成员函数
(它们可以是非静态成员函数),特别是大多数二元运算符重载作为非成员函数工作得更好,因为您可以在 LHS 和 RHS 上进行隐式转换以实现自由运算符重载,但仅在 RHS 上获得成员运算符重载。
std::swap
通常称为using std::swap; swap(x,y);
,以便类可以通过 ADL "重载"它。因此,以传统方式实现swap
需要一个非成员函数,如果只是作为调用成员函数的包装器。设计为 ADL 重载的其他函数也是如此。从技术上讲,静态成员函数不能具有"C"链接,因此在与其他语言交互时不适合用作回调。在实践中,C++ ABI 倾向于使静态函数调用与 C 兼容,当然前提是它们的参数和返回类型存在于 C 中。
到目前为止,我可以想到一种情况必须是静态成员函数而不是自由函数:
- 您希望使用访问说明符
protected
。私有静态成员函数通常是没有意义的,因为通常最好在.cpp文件中定义一个具有内部链接的自由函数,其他人甚至看不到它,更不用说调用它了。但我想偶尔你会想要一个。
除此之外,这实际上是一个风格问题,静态成员函数和自由函数之间没有太大的实际区别。
自由函数也是正确编写泛型代码(泛型编程中的泛型)的好方法,因为它有助于扩展接口而无需侵入性地修改现有代码。
C++既面向面向OO又面向泛型编程。选择你的;)
有些函数需要在类之外定义。例如,像 strcpy() 这样的函数,它不作用于类类型。但是它们应该放在命名空间中。
自由函数的重要用途是当同一个函数需要访问多个对象时。任何只访问一个对象的东西都应该是成员函数,但如果它改变了几个对象,它应该是一个自由函数。
相关文章:
- 在命名空间中定义函数还是限定函数
- 为什么在定义函数之前先声明它
- 使用用户定义函数的字符串反转
- 用户定义函数中的指针和输入
- 这个c++代码是如何在没有定义函数的情况下运行的
- 具有外部"c"和程序集的未定义函数
- 已定义函数时出现 G++ "未定义的引用"错误
- 将自定义函数传递到基抽象类中以延迟执行
- C++使用 rand 定义函数语法
- Arduino:在 loop() 和自定义函数中运行相同的代码时出现问题
- 将具有固定签名的自定义函数名称注入 CRTP
- 使用定义函数模板别名
- 是否可以使用单个定义定义函数的常量和常规版本?(使用模板,自动,decltype等)
- 在内联程序集中定义函数和从 C++ 调用时出现问题
- 在 Metal 着色器代码中,如何定义函数的 in/out 参数变量?
- 声明和定义函数静态会产生"undefined reference to function_name()"
- 朋友定义函数的名称空间是什么
- 介子 对用户定义函数的未定义引用
- 如何使用 "using" 关键字定义函数原型/签名
- 在 C 结构中定义C++函数