如果一个类函数成员不依赖于该类的任何成员,那么为什么它应该成为该类的一部分呢?
答案 0 :(得分:7)
没有。事实上,you should prefer free-functions over member functions。只有真正需要对成员进行操作的函数才应该是成员函数the rest should use them to provide functionality。
答案 1 :(得分:1)
假设您的意思是“不依赖于任何非公开成员”,Scott Meyers曾answered a definite no提出该问题。
然而,他只关注封装:通过使这些函数成为非成员来改进封装。
其他注意事项可以包括,如果将运算符定义为非成员,则无法在临时调用operator<<
。 (为什么你会想要这样做?好吧,例如从组成部分建立一个字符串参数,iostream风格。)
考虑因素可以包括使用符号的自然和清晰程度。嵌套调用的符号(与非成员一样)可能相当烦人且不清楚。这就是我们->
作为*
取消引用+成员选择的语法糖的原因。
因此,如果您只关注封装,那么将这些成员函数移出课堂,正如Scott Meyers所说。否则,在考虑可用性和符号清晰度等方面做出工程决策。无论如何,不要担心它:它可能不是非常重要。 : - )
干杯&amp;第h。,
答案 2 :(得分:0)
如果它与类的含义相关,即使它不使用该类的任何成员,也应将它放在一起。
它仅仅是开发的原因,也是未来开发人员知道在哪里寻找的原因。
答案 3 :(得分:0)
重写虚拟功能时经常会发生这种情况。例如,如果基类在getWidgetCount()行中具有纯虚拟,并且派生类不支持小部件,则它将返回0。
答案 4 :(得分:0)
最常见的案例涉及实用程序类,例如,如果我必须开发将BSTR转换为字符串的函数,反之亦然,我可以用静态方法创建一个类。
将相同区域的函数打包在同一个类中是有用的,另一个解决方案是将它们打包在同一个命名空间中,但不幸的是,即使在众所周知的c ++库中,命名空间也不常用。
并且对于其他情况,向与其他成员无关的类添加方法会增加内聚力的缺乏,并且度量LCOM会很高,并且设计将受到影响。