const关键字的妙用

const可用于修饰变量,成员函数等待.

用于成员函数的const

规则一

const object
(data members不得变动)
non-const object
(data members可变动)
const member functions
(保证不更改data members)
yes yes
non-const member functions
(不保证data members不变)
no yes

规则二

当成员函数的const和non-const版本同时存在,const object只会(只能)调用const版本,non-const object只会(只能)调用non-const版本

关于规则二的例子:
class template std::basci_string<…>有如下两个member functions:

1
2
charT operator[](size_t pos) const { /*...*/ } // 需要考虑cow
reference operator[](size_t pos) { /*...*/ } // 不需要考虑cow

COW:copy on write
多个对象共享底层字符串对象;常量对象不会修改其底层对象,因此不需要考虑COW;对于非常量对象,需要考虑COW,当多个共享底层字符串的对象中的某个需要修改底层数据时,需要为该对象复制一份底层对象,让其独享.