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约束:
- 【Effective C++】条款03-尽可能使用const
- Effective C++:条款03:尽可能使用const
- [Effective C++]条款03:尽可能使用const
- Effective C++--条款03:尽可能使用const
- 《Effective C++》学习笔记条款03 尽可能使用const
- Effective C++学习3 条款03:尽可能使用const
- effective c++:条款21: 尽可能使用const
- 读书笔记《Effective C++》条款03:尽可能使用const
- Effective C++——》条款3:尽可能使用const .
- 《Effect C++》学习------条款03:尽可能使用const
- Effective C++ 读书笔记 条款03:尽可能使用const
- Effective C++条款03解读:尽可能使用const
- Effective C++读书笔记 条款03:尽可能使用const
- 《Effective C++读书笔记》--条款03:尽可能使用const
- Effective C++ 条款3——尽可能使用const
- effective c++条款3(尽可能使用const)
- effective c++ 条款21: 尽可能使用const
- effective c++条款21: 尽可能使用const
- 文字列转换成数字形式
- Spring学习笔记:spring集成hibernate
- 几个移位的小例子
- The C10K problem翻译
- windows 2003,windows 7,windows xp 混装方法
- Effective C++学习3 条款03:尽可能使用const
- 开通博客!
- [转贴]怎样让一个Service开机自动启动
- Struts与Spring集成方式
- 想问前辈一下问题
- 关于 webAppRootKey 发布工程时报错
- 数据库设计2
- ubuntu下编译、运行larbin
- 求正整数中第K个二制中不含11的数