原则23:宁以非member、非friend替换member函数

这是Effective C++中第23条原则的内容,我感到很奇怪,成员函数调用本类的成员怎么了?难道这还不够封装吗?看下面的解释吧。
类中可能存在一系列函数用来处理一系列操作,而这一系列函数可以放在类中某一成员函数中一起执行,但是也可以放在一个非成员函数中一起执行。那么从封装性上来讲哪一个好呢?答案是非成员函数,这是因为成员函数还可以访问类中的私有成员,但是非成员函数连私有成员都访问不了,所以非成员函数的封装性更好。
要知道越多东西被封装,就会有更大的余地在不为人知的情况下更改被封装的数据,在这里友元函数和成员函数一样,所以本原则推崇的是非友元函数和非成员函数。
这对于那些纯面向对象语言,像JAVA,而言很不幸,因为它们没有独立的函数存在。所以在这种情况下可以考虑写一个工具类,在此类中添加函数,这样这些函数就不是成员函数了。而C++的做法是把这些独立的函数和被操作的类放在同一命名空间下。
本原则这样做的另一个原因是出于可扩展原则。因为完成某一特定功能可能需要一系列的函数,但是你可能需要完成很多功能,而这些功能都属于同一个工程。这个时候你可以为这个工程明明一个名字空间,然后把每个功能写在一个独立的头文件里面,因为它们共同隶属于同一个命名空间,所以在某个头文件中你就可以把操作那一系列成员函数的非成员非友元函数也写在同一头文件同一命名空间下。这样做既降低了编译相依性也提高程序扩展性。

你可能感兴趣的:(原则23:宁以非member、非friend替换member函数)