在操作类的函数中,哪些应该是成员函数,哪些应该是非成员函数?您有什么规则吗?例如,我有一个类,使用布尔矩阵表示迷宫。我正在编写一个名为 isConnected 的函数,用于验证迷宫中的两个点是否在同一区域(即从 A 到 B 是否可以行走)。
这个函数应该是成员函数还是非成员函数?有什么好的规则吗?
Herb Sutter说:"我们如果有可能的话,希望把它们变成非成员、非友元。",他比我聪明。
好的,两种方式都有一些争议。
支持非成员函数的理由:
container.begin()
如果container
是数组,则无效。这使得编写适用于容器的通用代码变得更加麻烦。但是begin(container)
可以对任何类型进行有效定义,甚至是内置类型,如数组)。它还可以使混合通过组合更加简洁,因为它不需要用户通过成员"点"操作来获取要操作的混合对象。支持成员函数的理由是:
而且...就只有这些了。 (但是这个论点不应该被低估。代码可读性很重要,如果人们发现成员版本更容易阅读,那么这是一个有力的支持论点。它只是不能产生更好的代码。从严格的"更好的代码"角度来看,可能情况下应优先考虑非成员函数。
何时将函数设计为成员函数:
何时将函数设计为独立函数:
>>
和<<
)以及二进制+
。isConnected
是一个测试对象状态的方法,即一个检查器,是成为成员函数的理想候选。我通常只会将非成员函数用于那些仅从成员函数内部调用的东西(不需要在类外可见),并且可以很好地操作类的公共成员和/或少量参数。