Effective C++学习3 条款03:尽可能使用const

来源:互联网 发布:刚进入金融行业 知乎 编辑:程序博客网 时间:2024/05/01 06:56

话说csdn写文章的网页有点问题,上次写了n久的文章点发表竟然就这样消失了,只好再重写次吧。

这次是伟大的const,记得上面向对象时我们的胡兰青姐姐用这个const把我们折磨的死去活来,来回的折腾const。不过正因为这个,我现在对const还是比较重视的,在写代码时总会考虑是否需要加上const。

const允许你指定一个语义约束(知道一个不该被改动的对象),而编译器会强制实施这项约定。而一个准则就是:只要这(某值保持不变)是事实,你就该说出来,因为说出来是可以获得编译器的帮助,确保这条约束不被违反。

const基本用法

基本的用法入下:

这里有几点需要说明下:1.第四行和第三行的表示方法表示同一个意义:指针指向的数据是const。而这两种方法都有人在采用,所以在看代码的时候要注意。

2.函数返回const结果的原因:一般是为了安全性和高效性考虑的。假设我们有这样一个有理数类(rational),它有一个operator*的函数:

我们发现如果那个返回值不是const,那个本该错误的赋值操作将完全正确的通过编译。有人会说,我怎么会这么白痴的写出这种代码的?那么如果是下面的情况就有可能了。

而函数参数的const则是老生常谈了,也就不赘述了。总而言之,在需要的地方加上const是保证程序健壮性的重要一步。

const成员函数

const成员函数说明这个函数是不会改变对象的数据,同时只有const的对象可以调用。表示的方法是在函数的最后加上一个const关键词。一个常被人们漠视的事实:两个函数其他都一样,只是一个是const成员函数,另一个是普通成员函数,它们是可以重载的。例如:

bitwise constness和logical constness

对于const成员函数,如何才能称作const呢?一般认为只要做到bitwise constness就行了,也就是函数对于对象内的non-static成员变量没有做任何的更改。而编译器也是采用这种方式判断的。然而事实往往会不同,我们依然可以通过bitwise的const成员函数修改对象内的成员。例如:

 我们看到通过函数传出来的地址,我们还是把const对象的内容改掉了,而这个代码运行正常。

针对这种情况,有人提出了logical constness,意思是:一个const成员函数可以修改它所处理的对象的某些bits,但只在客户端侦测不到的情况下才可如此。比如,上面的CTextBlock class可能需要cache文本块的长度以便应付查询:

由于编译器只认bitwise constness,所以这里会报错,解决的办法是:将需要改变的变量改为mutable(可变的),mutable释放掉了non-static成员变量的bitwise constness约束:

 

原创粉丝点击