条款 03:尽可能使用 const

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 版本可以避免代码重复
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. 让自己习惯C++ 条款01:视C++为一个语言联邦 为了更好的理解C++,我们将C++分解为四个主要次语言:...
    Mr希灵阅读 7,876评论 0 13
  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy阅读 13,146评论 1 51
  • 重新系统学习下C++;但是还是少了好多知识点;socket;unix;stl;boost等; C++ 教程 | 菜...
    kakukeme阅读 20,151评论 0 50
  • 全局作用域:在程序的任何位置都可以使用。 局部作用域:在程序的某个范围内可以使用。 全局 1.直接定义的的函数或者...
    frankisbaby阅读 1,384评论 0 0
  • 是不是每个人的二十岁都是我这样?期待假期,可是假期又无所事事,两三天咸鱼躺,刷剧,叫外卖,看小说,自己不喜欢这种状...
    840625501590阅读 1,007评论 0 0