对类操作的函数应该是成员函数还是非成员函数的规则是什么?例如,我有一个使用bools矩阵表示迷宫的类.我正在创建一个名为isConnected的函数,它验证迷宫中的2个点位于同一区域(即可以从A行进到B).
这应该是会员还是非会员?什么是好规则?
Herb Sutter说"如果合理可能的话,我们想让他们成为非成员的非朋友",而且他比我更聪明.
http://www.gotw.ca/gotw/084.htm
嗯,两者都存在争议.
赞成非成员函数:
它提供更好的封装
它允许更好的代码重用(std :: find可以重用于任何容器类型,因为它是一个自由函数.如果它是一个成员,那么容器必须定义它自己的)
它使很多通用编程技巧变得更容易.(container.begin()
如果container
是数组则无效.这使得编写处理容器的通用代码变得更加尴尬.但是begin(container)
对于任何类型,甚至像数组这样的内置代码都可以有效.它还可以通过合成使mixins变得更加清晰,因为它不需要用户通过成员"点"自己来获取你想要操作的mixin对象.
赞成制作会员功能的是:
这很熟悉.Java和C#需要这个,在很多程序员看来,成员函数是OOP的同义词.
而且......就是这样.(但是这个论点不应该被低估.代码可读性很重要,如果人们发现阅读成员版本更容易,那么这是一个有利的论据.它只是不会产生更好的代码.从严格的"更好的代码"从观点来看,应尽可能优先选择非成员.
何时使其成为成员函数:
当函数与类逻辑耦合时(如迷宫连接示例)
当函数需要访问私有或受保护的成员时,最好使其成为成员而不是朋友.
何时使其成为独立功能
当它是一个通用函数,可以被模板化以自然地在其他类上工作(查看