const与指针
- 出现在星号左边:被指物是常量
- 出现在星号右边:指针自身是常量
被指物是常量时,const写在类型前或类型后都行
const Widget* buf;
Widget const* buf;
const与迭代器
STL迭代器是以指针为根据塑模出来,所以迭代器的作用就像个T*指针。
- 迭代器不得指向不同的东西,需要为迭代器添加const关键字;
- 迭代器所指的东西不可被改变,需要使用const_iterator;
std::vector<int> v;
const std::vector<int>::iterator it = v.begin();
*it = 10; //正确, 改变it所指物
++it; //错误, it是const
std::vector<int>::const_iterator cit = v.cbegin();
*cit = 10;//错误
++cit;//正确
const与函数声明
函数返回值与形参
防止参数被修改,预防“没意义的赋值动作”
const成员函数
确保该成员函数可以作用于const对象
const成员函数的重要性:
- 区分哪个函数可以改动对象内容而哪个函数不行
- 使“操作const对象”称为可能
传递对象的高效方法是pass by reference-to-const方式
C++重要特性:
两个成员函数如果只是常量性不同,可以被重载。
void print(const TextBlock& ctb)
{
std::cout << ctb[0]; //ctb是const,调用const TextBlock::operator[]
...
}
C/C++特性:
如果函数的返回类型是个内置类型,那么改动函数返回值不合法。
纵使合法,by value返回对象意味着改动的其实是返回对象的一个副本,没意义。
const成员函数的相关难题:
问题1:我们知道,所有编译器都强制实施bitwise constness,如果我想在const成员函数内修改non-static成员变量该怎么做?
解决方法:
利用mutable可以释放掉non-static成员变量的bitwise constness约束;
mutable std::size_t textLenght;//这些成员变量可能总是会被更改
mutable bool lengthIsValid;//即使在const成员函数内
问题2:当const和non-const成员函数有着实质等价的实现时,代码量很大的情况下,应该如何避免代码重复?
解决方法:令non-const版本调用const版本即可。
char& operator[](std::size_t position)
{
return const_cast<char&>(static_cast<const TextBlock&>(*this)[position]);
}
- static_cast将*this从原始类型TextBlock&转型为const TextBlock&(调用const op[]);
- const_cast从const operator[]的返回值中移除const;
反向做法不行,const成员函数调用non-const成员函数是一种错误行为。