effective C++读书笔记--【条款03:尽可能使用const】

这一节的意思其实总结下来就是一个目的:“对象不该被改变”的语义约束尽量交给编译器来做,方法就是使用const,说人话就是如果程序员希望一个对象的值是不能被改变的,请积极大胆的给这个对象加上const。

然后为什么要尽量使用const呢,作者大体从4个角度来说明这个const的使用场景:

  1. const指针和指向const对象的指针;
  2. STL迭代器与const结合后的效果;
  3. 函数的返回值或参数搞成const类型有很多好处;
  4. 对象的const成员函数也有很多好处。

先说这四个吧。

1.老生常谈的const指针和指向const对象的指针

第一个事是区分const指针和指向const对象的指针,这个不赘述了,区分const int * a和int * const a的区分方法其实很简单,在脑海中把类型部分去掉就好办了,比如上面这对就变成const *a和*const a,怎么区分应该很清楚了吧。

2.STL迭代器的const问题

STL里的迭代器,因为这个“STL迭代器“可以理解为是在指针的基础上套了个马甲,所以一个interator可以理解为一个T*。也就是说:

std:vector<int>::iterator inter ---理解为---> interator_type * inter,因此,如果出现 const std::vector<int>::interator iter这样的声明,就理解为interator_type * const inter,这里inter是个const指针,不能指向别的东西,类似++inter的操作是非法的;

但是如果希望达到 const interator_type * inter的效果怎么办?也就是inter指向的对象不能改变值,C++有提供const_interator啊,就像这样就好了:std:vector<int>::const_iterator cInter---理解为---> const interator_type * clnter,;类似*cIter = 10的操作是不可以的。

3.函数返回值类型和函数参数类型为const

3.1 函数返回值为const类型

这个刚开始有点方,例举了重载operator *的例子,能理解,但没有说明其他的运算符重载函数呢?其他的常规函数呢?

作者的意思不是说函数的返回值都做成const类型,而是介绍这样的手段可以避免码农因为不小心而对函数返回值进行赋值。特别是自定义类的operator*()方法,最好将返回值定义为const,保证与内置类型的*操作结果兼容,这样才是一个“良好的自定义类型”。嗯作者其实想说把函数返回值搞成const是有这么一种用处的。

3.2 函数参数类型为const类型

这个应该大家都已经比较熟悉了,总之函数内部不会更改实参值的话就写上吧,不啰嗦了。

4.const成员函数

4.1 const成员函数存在的意义

这里其实是事关三个定理,而大家都很熟悉的是定理一:

【定理一】一个类的const成员函数不能改动对象内容,只能改动类的static成员值

这里后半句是因为static成员是属于类的,而不属于任何“对象”;

但是这里把这个东西拿出来反复嚼的意思是说还有另外一个方向来理解这个const成员函数:

const成员函数的存在意义更在于使得操作“const对象”成为可能

为什么会有“const对象”,因为如条款20中的“pass by reference to const方法传递对象”给函数,引用传递提高了传参效率,但是暴露了实参,为了保证引用对象不会被不甚修改,干脆就const方法传递,这就是const对象的出处,而const对象当然也需要用const成员函数来运作了,因此事情是酱紫的:

问题:对象做函数参数时传值的效率实在太低怎么办?

    --->【解决】:用引用传参解决;

          【问题】:引用传参可能导致函数内部不甚修改对象的值很不安全,怎么办?

                 --->【解决】:那就const引用的方式来传;

                       【问题】:const引用的对象,总得有点方法来供它调用吧,而且这些方法不能更改对象自己的内容啊;

                              --->【解决】:const成员函数闪亮登场。

好,到这里其实定理二也已经出来了:

定理二】一个const对象只能调用自己的const成员函数

定理二的存在又和定理三相辅相成

定理三】两个成员函数如果只是常量性不同,则互为重载函数

定理三有什么用呢:自定义类,对于一组非const成员函数设为A组,可以实现另外一组const成员函数B组来完全重载A组,然后由于【定理二】和【定理三】,当类对象是const对象的时候,在调用这些方法时自动调用的是B组里面的const成员函数。

当然上面说的A组和B组会引入一些小麻烦,那就是某些不改变对象成员的代码可能会在A组和B组中重复,这很不爽,作者说,此时的处理方法为:用A组的函数(可能改变对象成员值)去调用B组的同名函数(不可能改变对象成员值)来解决,这个应该不用再解释了吧.....

4.2 貌似还剩一些啰里八嗦的东西

好啰嗦啊,组织下语言改天再展开吧。。。

猜你喜欢

转载自blog.csdn.net/haolianglh/article/details/82531504
今日推荐