面向对象守则要求数据应该尽可能被封装,然而与直观相反地,member函数带来的封装性比non-member函数低。
考虑对象内的数据,越少的代码可以看到数据(也就是访问它),越多的数据可以被封装,而我们也就越能自由地改变对象数据,例如改变成员变量的数量、类型等。如何衡量“有多少代码可以看到某一块的数据”?我们计算能够访问该数据的函数数量,作为一种粗糙的测量,越多函数可以访问它,数据的封装性就越低。
相比member函数和friend函数,non-member函数和non-friend函数不能直接访问private数据成员,拥有更好的封装性,因此如果成员函数和非成员函数可以提供相同的功能,那么非成员函数的封装性更好。
注意non-member函数可以是另一个类的member函数,这样也不会破环类的封装性。