结论
- 编译器强制实施 bitwise constness,但你编写程序时应该使用概念上的常量性。
- 当 const 和 non-const 成员函数有着实质等价的实现时,令 non-const 版本调用 const 版本可避免重复。
bitwise constness —— 不更改对象的任一bit
class CTextBlock {
public:
...
char &operator[](std::size_t position) const {
return pText[position];
}
private:
char *pText;
};
const CTextBlock cctb("Hello"); // 创建常量对象
char *pc = &cctb[0]; // 调用const成员函数 返回指向内容的指针
*pc = 'J'; // 指针指向的值可以改变,与常量对象矛盾
logical constness
一个 const 成员函数可以修改它所处理的对象的某些 bits,但要保证在用户使用中侦测不出。
mutable 成员变量,即使在 const 成员函数内也可被修改。
指针的位置
- const 在 * 左边,表示所指物是常量;
- const 在 * 右边,表示指针是常量。
* 是 const (指针是常量)
迭代器
迭代器本身是 const
// 先初始化一个 vector
std::vector<int> my_vec = {0, 1, 2, 3, 4};
// 这里是一个const的迭代器,说明迭代器本身不可修改,但是指向的内容可以修改
const std::vector<int>::iterator iter = my_vec.begin();
cout << *iter << endl;
*iter = 10;
cout << *iter << endl;
// 下面的都通不过编译
// iter++;
// iter = my_vec.end();
迭代器指向的内容为 const
// 先初始化一个 vector
std::vector<int> my_vec = {0, 1, 2, 3, 4};
std::vector<int>::const_iterator c_iter;
c_iter = my_vec.begin();
cout << *c_iter << endl;
// 下面这句话通不过编译
// *c_iter = 20;