C++编程技巧——常用const_列举cconst的常用方法
【const】指定了「不可被改动」的语义约束。它可以将各种变量修饰为常量,在修饰指针时出现在*左边表示被指物是常量,在*右边表示指针自身是常量。但【const】在函数声明时的运用更多:
一、令函数返回一个常量
这种做法往往可以降低用户的一些错误操作,比如【(a*b) = c】。尽管一般都知道这无意义,但不排除有人就是这样写了,如果你将【operator*】函数的返回值修饰为【const】就可以避免这种错误。
二、修饰成员函数
首先,【const】修饰成员函数的目的是为了表明这个函数不能改动对象内容。这里有两个理解,一是bitwise constness:成员函数不能修改对象的任何一个bit才可以被称为const。但在实际中,许多成员函数不具备这种要求却通过了编译器的bitwise测试,如下图:
【operator[]】理论上并不能修改【text】,但是通过指针却可以做到:
通过这种操作,【t】中的hello world被改为了jello world。因此就有了另一种解释logical constness:【const】成员函数可以修改一些对象内数据,只要客户看不到就行。为了通过编译器的bitwise测试修改一些对象内数据,需要使用【mutable】关键字修饰要更改的对象内数据。
三、修饰成员函数怎么避免【const】与非【const】函数代码重复
我们会对同一个功能写一个【const】版本函数和一个非【const】版本函数,这就造成两个函数代码高度重复。因此我们会使用非【const】版本函数调用【const】版本函数来避免此问题。这就需要一些转换:
通过【static_cast】将【this】指针转为【const】,再调用【const 类型 operator[]】。最后将返回值的【const】通过【const_cast】去除。需要注意的是,不要使用反向做法——【const】函数调用非【const】函数,毕竟你不知道非【const】函数做了什么,会不会修改对象数据。