条款03:尽可能使用const

一、顶层const和底层const

区分一下:

int a = 1;
const int* pa = a;//底层const,a的值不能变
int b = 2;
int* const pb = b;//顶层const,pb的值不能变,即不能更改pb的指向

注意除了指针这种复合类型,其余基本类型的变量设置const全部为顶层const

二、const作用于迭代器

声明一个const迭代器与顶层指针类似:

const vector<int>::iterator it = vec.begin(); //类似一个顶层指针int* const,也就是it作为一个迭代器,不能更改指向,必须始终指向vec.begin()
*it = 111; //可以
++it; //不行

要想模拟底层const,可以直接使用const_iterator

vector<int>::const_iterator cIt = vec.begin();//模拟底层const
*cIt = 111; //不行
++cIt; //可以

三、const作用于函数返回值

比如一个运算符函数operator*,如果不将参数返回值声明为const的话,会出现下面的情况

if(a * b == c)//这一句如果手误写成下面的形式,就不会被识别出来
if(a * b = c)

但是将operator*的返回值声明为const,即可避免这一问题

const T oprator*(const T& left, const T& right);

四、const作用于成员函数

当一个成员函数为常函数,注意不是返回值为const,而是函数为const

char func() const;//常函数,可以被常对象调用
const char& func();//返回值为const

要想在const成员函数内改变某些成员变量,只需要将需要修改的成员变量声明为mutable

五、在non-const函数中可以调用const函数版本

这一处主要用来减少代码重复,因为两个函数只是常量性不同的话,即使函数体完全相同,也是重载的函数。可以用const函数实现出对应代码的non-const版本,但是反过来不行。

这是因为const函数承诺不改变对象的逻辑状态,non-const函数没有这样的承诺。如果在const函数内调用non-const函数,就违反了这一承诺。non-const函数本来就可以对对象做任何动作,在其中调用一个const函数并没有风险。

【Effective C++ 条款03 笔记】尽可能使用const相关推荐

  1. Effective C++ 条款03:尽可能使用const

    场景一 用于修饰指针 char greeting[] = "Hello"; char* p = greeting; // non-const pointer, non-const ...

  2. 条款 03:尽可能使用const

    条款 03:尽可能使用const 1.请记住 2.原因 3.const用法 3.1.在classes外部修饰global或namespace作用域中的常量 3.2.修饰文件.函数.或区块作用域中被声明 ...

  3. const 常量_条款03:尽可能使用const

    const 允许你指定一个语义约束(也就是指定一个"不该被改动"的对象),而编译器会强制实施这项约束. 1.const指针 如果关键字const出现在星号左边,表示被指物是常量:如 ...

  4. effective C++ 条款 3:尽可能使用const

    const 修饰指针:如果关键字const出现在星号*左边,表示被指物是常量,如果const出现在*右边表示指针自身是常量, 如果出现在两边表示被指物和指针都是常量: const std::vecto ...

  5. Effective C++ 条款02:尽量使用const,enum,inline替换#define

    Effective C++ 条款02:尽量使用const,enum,inline替换#define 用另一句话说:用编译器代替预处理器比较好. 举个例子:加入定义一个常量: #define ASPEC ...

  6. char* 赋值 const char* 释放_Effective C++读书笔记之条款3:尽可能使用const

    点击上方蓝字关注我们 C++的const关键字会强制编译器实施保持某个值不变的约束,帮助你在编译期间就能发现错误,灵活使用const能提高代码质量还能避免不想被改变的值被修改.下面我将从const作用 ...

  7. 【03】尽可能使用const

    1.为什么搞出const关键字? const指定一个语义约束,指定一个对象不可修改.如果一个对象不可修改,就应该说出来. 2.const与指针 const可以修饰指向之物,也可以修改指针本身.STL中 ...

  8. 《Effective C++》读书笔记(一)

    <Effective C++>读书笔记 条款01:视C++为一个语言联邦 C++高效编程守则视状况而变化,取决于你使用C++的哪一部分(C, Obejct-Oriented C++, Te ...

  9. 《Effective C++》学习笔记(持续更新)

    此文由来 <Effective C++>同<C++ primier>一样,也是非常出名的一本书,正如此书的副标题所说--改善程序与设计的55个具体做法,此书的目的,就是教会读者 ...

最新文章

  1. 机器学习:Python中如何使用最小二乘法
  2. 深度学习已成强弩之末?Bengio等大牛NeurlPS2019上支招
  3. spring boot创建应用 端口冲突8080
  4. 终于弄明白Framework 3.5为什么在IIS的ASP.NET选项找不到?
  5. 代码管理 ,git 命令整理
  6. 多线程同步中sleep与wait区别
  7. 关于计算机 硬件方方面的整理
  8. Ultra96_v2实现交通标示识别
  9. 微信小程序开发学习记录01
  10. 【华为云技术分享】【昇腾】【玩转Atlas200DK系列】基于Pycharm专业版构建开发板python开发运行环境
  11. NOIP2018游记题解
  12. C# 连接 Exchange 发送邮件
  13. 农学院计算机考试题,天津农学院计算机考试参考.doc
  14. html切图软件,切图工具/插件介绍
  15. java随机昵称_Java随机产生中文昵称
  16. 知足知不足 有为有不为
  17. 特别关注:“网络同居”热背后的心理学分析
  18. ORACLE drop user时遇到的ORA-00604和ORA-00942错误排查
  19. 计算机网络五层体系结构各层协议
  20. 搭建大型分布式服务(十四)SpringBoot整合dubbo starter

热门文章

  1. YOLOV7使用CADCD数据集实验记录
  2. matlab图形编辑,Matlab图形与编辑
  3. 手绘如何学?零基础手绘教程
  4. Devices STATUS Processing
  5. 将数组作为参数进行传递(转)
  6. 利用DPCM编码进行图像压缩
  7. 十六 周记1 (10.17-10.23)
  8. 如何解决Win10上OneNote 2016的同步问题
  9. Matlab中的pinv和inv
  10. 程序开发中的细节一:重视空格的缺失(The JSP specification requires that an attribute name is preceded by whitespace)