文章目录
- 条款 03:尽可能使用 `const`
- 1. `const` 在指针中的使用
- 2. `const` 在迭代器中的使用
- 3. `const` 修饰函数返回值
- 4. `const` 在成员函数中的应用
- `bitwise constness`
- `logical constness`
- 5. 避免代码重复的技巧
- 6. 总结
条款 03:尽可能使用 const
const
是 C++ 中一个重要的关键字,能够帮助开发者表达和维护程序的“不变性”约束,从而提高代码的安全性和可读性。
1. const
在指针中的使用
根据 const
在声明中的位置,含义不同:
-
const
出现在星号左边:表示被指物是常量,例如:const int* p;
表示*p
是只读的,不能被修改,但指针p
可以指向其他对象。 -
const
出现在星号右边:表示指针本身是常量,例如:int* const p;
表示p
是固定不变的,但*p
的内容可以修改。 -
const
两边都有:表示被指物和指针本身都是常量,例如:const int* const p;
表示p
不能修改,*p
也不能修改。
2. const
在迭代器中的使用
声明迭代器为 const
类似于声明一个 T* const
指针,表示迭代器本身不可修改。如果希望迭代器所指的值不可修改(即模拟 const T*
),应使用 const_iterator
。
3. const
修饰函数返回值
当 const
修饰函数返回值时,表示返回值是只读的。例如:
const int getValue();
表示返回的整数不能被修改,这通常用于防止调用者改变返回的内容。
4. const
在成员函数中的应用
bitwise constness
- 一个成员函数只有在不改变对象的任何成员变量(
static
除外)时,才能标记为const
。 - 编译器会强制检查这一规则。
logical constness
- 逻辑上的常量性允许成员函数修改某些 bits,但这些修改对调用者不可见。
- 这种情况需要使用
mutable
关键字来解除bitwise constness
的限制。例如:mutable int cache;
表示cache
即使在const
函数中也可以修改。
5. 避免代码重复的技巧
当 const
和非 const
成员函数具有实质等价的实现时,可以令非 const
版本调用 const
版本,避免重复代码。以下是示例:
class TextBlock {
public:// const 版本的运算符重载const char& operator[](std::size_t position) const {// 返回 text[position],该版本不能修改 TextBlock 对象的内容return text[position];}// 非 const 版本的运算符重载char& operator[](std::size_t position) {// 通过 const_cast 去除 const 属性,然后调用 const 版本的运算符重载return const_cast<char&>(static_cast<const TextBlock&>(*this)[position]);}
};
这种方式避免了为类似逻辑重复编写实现。
6. 总结
- 使用
const
可以帮助编译器检测错误的用法。 const
可用于任何作用域内的对象、函数参数、函数返回类型和成员函数。- 编译器强制实施
bitwise constness
,但开发者应更关注“概念上的常量性”。 - 通过
mutable
可以释放对某些非静态成员变量的bitwise constness
限制。 - 通过让非
const
成员函数调用const
版本,可简化代码并减少重复。