C++ 杂记

条款 03:尽可能使用 const

2017-07-18  本文已影响16人  赵者也

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自身,没问题











请记住:

  1. 将某些东西声明为 const 可帮助编译器侦测出错误用法。const 可被施加于任何作用域内的对象、函数参数、函数返回类型、成员函数本身
  2. 编译器强制实施 bitwise constness,但我们编写程序时应该使用“概念上的常量性”
  3. 当 const 和 non-const 成员函数有着实质等价的实现时,令 non-const 版本调用 const 版本可以避免代码重复
上一篇下一篇

猜你喜欢

热点阅读