Effective C++ 之学习:from 条款21 to ...

条款21:Don't try to return a reference when you must return an object

观点一:在使用引用的时候必须明确该引用指向谁,引用是常指针实现的,故而其所指向的对象肯定是唯一不可变的,所以在使用引用的时候必须明确其指向。

观点二:函数应该尽可能的避免返回一个指向局部对象的指针或者引用。因为局部对象在函数体执行完之后就会被销毁,这时候,指针和引用就找不到其指向的对象,就会出现严重错误。即便是返回建立在堆上的对象,因为在返回该对象的引用之后,无法真正获取其背后的指针,也就无法delete所new的对象,出现内存泄漏。(堆中的变量不会自动解析?)

eg:

const A& operator*(const A& lhs,const A& rhs)
{
  A* res = new A(lhs.val*rhs.val)
  return *res;
}
A a1,a2,a3,a4;
a4 = a1*a2*a3;

调用两次operator*,但是却没法删除对应的对象(因为函数体内部每次都会new一个对象来保存*的结果,无法删除的是这个new的对象res,而不是a2,a3,a4)

条款22:declear data members private

其一:将成员变量声明为public,类的用户就可以随意更改之,而不用遵循某种类设计者的规则,这可能导致类的使用偏离于类的设计目的。比如说有一个类用来描述树木,其属性有直径,高度等等,如果这些成员变量(属性)能被随意更改,那可能设计出一个直径10,高1的树对象,这很明显不符合常理。

其二,private体现出封装的好处,封装之后,不能随意接触到类的成员变量,必须通过类设计者设计的public成员函数来访问,这样设计者可以在该成员函数中施加一定的约束,确保不会出现偏离类的设计目的。且不仅仅是约束,也可以使得类的实现更加弹性(可以提供很多个接口,以多种方式访问某个成员变量,比如const和非const)。

其三,封装之后,所有的访问者都必须经过同一个或者同一批接口去访问某个成员变量,那么当这个成员变量改变的时候,也许只需要改变这个接口的实现就可以保证系统的正常运行,而不必重写与该变量有关的所有代码。比如设计一个检测车辆实时速度的类,一开始类内有个变量a,记录当前平均速度,成员函数返回该变量。当因为内存限制,类删去了这个变量,那么修改接口函数,使其从收集器中获取数据,来临时计算平均速度并返回,就可以保证系统正常运行。或者反过来,本身没有那个变量,但是后期类设计者为了追求该系统的反应速度,添加了这个变量来记录当前平均速度,此时也只需要让接口函数直接返回该变量即可。

其四:protected封装性也不好。

条款23:Prefer non-member, non-friend functions to member functions

non-member&non-friend 函数更加有利于封装。(越间接越封装?间接调用member functions)

从而更有利于大型程序的开发。由于类必须设计成一个整体,如果设计成member function OR friend function,后续编译如果只需要一部分内容,还是包括整个文件,降低了效率。设计为non-mem&non-friend可以在日后需要时,包含某些函数即可,不必包含整个类。

条款24:declear non-member function when type conversions should apply to all parameters

如果想让类的隐式类型转换发生在函数的每一个参数身上,最好把这个函数设计成non-mem&non-friend。

书上说的比较拗口,不过通过一个例子就可以感受到。

比如我们设计了一个complex类,现在想让complex类和int类之间作*运算且不用重新定义一个函数,而是直接用隐士转换,使得int隐式转换为complex类,这时候如果设计成mem函数,其调用形式是固定的,必须要么complex*int,要么complex.operator*(int),也就是int必须位于参数列表,位于complex之后,这明显不符合惩罚交换律。

不设计成friend函数的原因说的比较玄乎,friend带来的麻烦一般远大于其带来的便利,故而能不设计成friend就不涉及。

条款25没懂。。

条款26:postpone variable definitions as long as possible

就是将变量的定义尽量延后,最好的情况是在刚好要用到它之前定义,并尽可能用一个有意义的值去初始化它,这样可以防止在定义之后出现异常,然后整个程序都没用过这个变量,但是依然要承担定义这个变量的成本,包括析构,构造。避免使用default是避免出现无意义的赋值,提高程序的清晰度。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值