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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,269评论 25 708
  • 一:java概述:1,JDK:Java Development Kit,java的开发和运行环境,java的开发工...
    ZaneInTheSun阅读 2,687评论 0 11
  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy阅读 9,536评论 1 51
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,765评论 18 399
  • 题记: 我听见风穿过心间 你长成我心上的茧 从此以后 每年的这一天 抵过了流年 说起来这是一个非常简单的故事,电影...
    十二君子阅读 879评论 4 24