《Effective C++ 中文版 第三版》读书笔记
条款03:尽可能使用 const
面对指针:
char myname[] = "toby";
char* p = myname; //< non-const pointer,non-const data
const char* p = myname; //< non-const pointer,const data
char* const p = myname; //< const pointer,non-const data
const char* const p = myname; //< const pointer,const data
const 语法虽然变化多样,但并非高深莫测。如果关键字 const 出现在星号左边,表示被指物是常量;如果出现在星号右边,表示指针自身是常量;如果出现在两边就都是常量。因为是以“星号”为界,所以 const char * 与 char const * 两种写法意义是相同的。
STL 迭代器是以指针为依据定义出来的,所以迭代器的作用就像是 “T*” 指针。声明迭代器为 const 就像声明指针为 const 一样(即声明一个 T* const 指针),表示这个迭代器不得指向不同的东西,但其所指向的东西的值是可以改变的。如果希望迭代器所指向的东西的值不可以被改动(即希望 STL 模拟一个 const T* 指针),你需要的是 const_iterator,举例如下:
std::vector<int> vec;
...
const std::vector<int>::iterator iter = vec.begin(); //< iter的作用像一个T* const
*iter = 10; //< 改变所指之物,没问题
++iter; //< 改变iter自身,错
std::vector<int>::const_iterator cIter = vec.begin(); //< cIter的作用像const T*
*cIter = 10; //< 改变所指之物,错
++cIter; //< 改变iter自身,没问题
请记住:
- 将某些东西声明为 const 可帮助编译器侦测出错误用法。const 可被施加于任何作用域内的对象、函数参数、函数返回类型、成员函数本身
- 编译器强制实施 bitwise constness,但我们编写程序时应该使用“概念上的常量性”
- 当 const 和 non-const 成员函数有着实质等价的实现时,令 non-const 版本调用 const 版本可以避免代码重复