const 允许你指定一个语义约束(也就是指定一个“不该被改动”的对象),而编译器会强制实施这项约束。
1、const指针
如果关键字const出现在星号左边,表示被指物是常量;如果出现在星号右边,表示指针自身是常量;如果出现在星号两边,表示被指物和指针两者都是常量。
关键字const出现在类型前后类型后星号前,意义都是相同的,表示被指物是常量。
例:int const * a 等价于 const int *a
STL中的迭代器以指针为根据塑造出来的,所以迭代器的作用就相当于T*指针。声明迭代器为const就像声明指针为const一样(即声明一个T* const 指针),表示这个迭代器不能指向别的不同的东西,但他所指的值是可以改变的。如果你希望迭代器所指的东西不可被改动(即希望STL模拟一个const T*指针),这时候就需要的是const_iterator。两种格式:
const std::vector<int>::iterator
std::vector<int>::const_iterator
2、const 成员函数
将const 实施于成员函数的目的,是为了确认该成员函数可作用于const对象身上。
1、const成员函数的接口比较容易被理解,可以得知哪个函数可以改动对象,哪个函数不可以改动对象
2、是操纵 const 对象成为可能
两个成员函数如果只是常量性(constness)不同,可以被重载。
3、两个阵营:bitwise constness 和 logical constness
bitwise const阵营相信:成员函数只要在不更改对象的任何成员变量(static 除外)是才可以说是const。也就是说它不更改对象内的任何一个bit。
const成员虽然保证了成员变量值不会被改变,但是如果这个变量是指针或者引用,那么可以通过这个指针或引用去改变被指物。随便改变了值,但依然可以通过编译器编译。这里面虽然是满足了bitwise const
logical constness 阵营不主张:一个const成员函数可以修改它所处理的对象内的某些bits,但只有在客户端侦测不出的情况才可如此(没理解啥意思)
const成员函数中想要修改成员变量的话,在声明变量的时候在前面加上mutable即可。
4、在const 和 non-const 成员函数中避免重复
假若const 重载 non-const函数,但是其中的操作都是一样的,那么就会造成代码重复。可以让non-cosnt 函数去调用const函数。不过在调用过程中需要经过两次转型,1、将non-const的this指针转换为const指针2、将返回值得const去掉
请记住:
- 将某些东西声明为 const 可帮助编译器侦测出错误用法。 const 可被施加于任何作用域内的对象、函数参数、函数返回类型、成员函数本体。
- 编译器强制实施bitwise constness,但你编写程序时应该使用“概念上的常量性”(conceptual constness)
- 当const 和 non-const成员函数有着实质等价的实现时,令non-const版本调用const版本可避免代码重复
本文主要内容来自于侯捷老师译的《Effective C++》,大力推荐感兴趣的同学可以去购买。也欢迎大家交流!