尽可能用const
细节
const 出现在星号左边,表示被指物是常量
const 出现在星号右边,指针自身是常量
const int * pw;
int const * pw;含义相同
STL 迭代器中
-
const std::vector::iterator // iter 值不可变
-
std::vector::const_iterator cIter;// cIter 指向的内容不可变
-
将operator* 的返回值设置为const ,防止对* 重载后,的返回值进行误操作
const 参数我们很常见了,就是防止函数内部不小心对传入的值做不必要的修改
const 成员函数
是为了确认该成员函数可以用于const 对象上
C++ 一个很重要的特性,允许,两个成员函数只是常量性不同的重载
-
const char& operator[](std::size_t position)const
-
char& operator[](std::size_t position)
-
观察上面的函数,返回的是char 的引用,此时我们才能进行赋值操作,如果不是引用,编译器将提醒:
左操作数必须为左值 -
在const 和 non-const 成员函数中避免重复
- 针对上面的两个operator[] 来说,可以利用const 来实现non-const:
char & operatorp](std::size_t position){
return const_cast<char&> (
static_cast<const TextBlock&>(*this)[position]);} - 反过来不行,违反语义
- 针对上面的两个operator[] 来说,可以利用const 来实现non-const:
成员函数const 的讨论
-
bitwise const
-
编译器强制实施的
-
成员函数只有不更改对象任何成员变量时才可以说是const,不更改成员内的任何一个bit
-
但是,有些函数仍然可以逃过编译器的检测:
char& operator[](std::size_t position) const//声明为const 内部也不修改,但,返回值为引用,可通过其进行修改,修改为const char& 的输出可解决此问题 -
还有一个问题,文中列出一个例子:
函数成员函数,得到字符长度,它有一个缓存机制,此时,length() 虽然声明为const,但其内部不仅仅需要返回当前长度,还需要修改,缓存的,长度。- 解决方案:将需要被修改的变量,声明为:
mutable std::size_t textLength;// 这些成员变量可能总是会被修改,即使在const 成员函数内部
- 解决方案:将需要被修改的变量,声明为:
-
-
logical constness
-
一个const 成员函数可以修改它所处理的对象内的某些bits,但只有在客户端检测不到的情况下才能如此。
- 这就是上面的,mutable 用法
-