是否有在类之外定义函数或者在类中使用静态函数更好的情况?
答案 0 :(得分:4)
有些情况必须是非成员函数:
运算符重载不能是静态成员函数(它们可以是非静态成员函数),特别是大多数二元运算符重载作为非成员函数更好地工作,因为你在LHS和RHS上得到隐式转换对于免费的运算符重载,但仅限于成员运算符重载的RHS。
std::swap
通常称为using std::swap; swap(x,y);
,因此类可以通过ADL“重载”它。因此,传统上实现swap
需要非成员函数,如果仅作为调用成员函数的包装器。对于设计为ADL重载的其他函数也是如此。
从技术上讲,静态成员函数不能具有“C”链接,因此在与其他语言连接时不适合作为回调。在实践中,C ++ ABI倾向于使静态函数与C调用兼容,前提是它们的参数和返回类型存在于C中。
到目前为止,我可以想到一个必须是静态成员函数而不是自由函数的情况:
protected
。私有静态成员函数通常是没有意义的,因为在.cpp文件中定义带有内部链接的自由函数通常更好,其他人甚至都看不到它,更不用说调用它了。但我想偶尔你会想要一个。除此之外,它确实是一个风格问题,静态成员函数和自由函数之间没有太大的实际区别。
答案 1 :(得分:2)
自由函数也是正确编写通用代码的一种很好的方法(通用编程),因为它有助于扩展接口而不会干扰修改现有代码。
C ++既面向OO,也面向通用编程。选择你的;)
答案 2 :(得分:1)
某些函数需要在类之外定义。例如,strcpy()等函数不作用于类类型。但是它们应该被放入命名空间。
答案 3 :(得分:0)
自由函数的重要用途是当同一函数需要访问多个对象时。任何只访问一个对象的东西都应该是成员函数,但是如果它改变了几个对象,它应该是一个自由函数。