首先介绍一下什么是Logic Constness和Bitwise Constness,Logic Constness指的是function 后的const修饰,我们只知道这个function被const修饰了,但是并没有任何变量被const,Bitwise Constness指的是变量(指针,或者引用等,基本上任何的二进制储存值)被const修饰,那么我们下面就用例子来进行探索。

#include<iostream>
#include<vector>
#include<string>
using namespace std;class BigArray{vector<int> v;int accessCounter;int *v2;public:int getItem(int index) const{//accessCounter++;const_cast<BigArray*>(this)->accessCounter++;return v[index];}void setV2Item(int index, int x){*(v2+index) = x;}// Quiz:const int* const fun(const int* const& p) const{//return accessCounter++;
    }
};int main(){BigArray b;
}

  首先我们看getItem函数,因为这个函数不对对象的数据进行任何修改,所以我们将其修饰为const,一开始我们注释掉前两句,只有return v[index]; 发现程序编译通过,因为没有任何修改实例变量的操作,但是如果我们注释掉第一行,也就是accessCounter++; 我们就会发现,程序编译报错了,报错的原因就是getItem是Logic Const的函数,所以里面不能够对变量进行修改,因为这样就是打破了Bitwise Constness,但是是不是我们就不能对accessCounter进行修改呢?其实并不是,大致有两种方法可以对其进行修改:

  1. 使用mutable,在变量前面使用mutable进行修饰,这样就可以在const修饰的函数中进行修改。
  2. 还有一种C++方式,但是并不推荐的就是,使用const_cast对变量的const属性进行cast,这样就可以进行修改而不报错,但是此方法还是不推荐的,实际上在实际开发中,const修饰function的目的就是控制其不能修改变量值。

  再解答一下Quiz的一长串const修饰到底意味着什么:

  1. func的返回值为const的int值,其值为const,指针也为const,表示value和pointer都不可更改
  2. func的参数是一个指向const integer的const指针的引用
  3. func也是一个const function,说明不能直接对类中的变量进行修改,并且只能调用其他const函数

Advanced C++ -- Logic Constness and Bitwise Constness相关推荐

  1. 【Effective C++】总结

    文章目录 一.自己习惯c++ 视c++为一个语言联邦 尽量以 const,enum,inline 替换 #define 尽可能使用const 确定对象初始化 二.构造,析构,赋值 了解c++默默编写并 ...

  2. Effective C++ 01 让自己习惯 C++

    1. 让自己习惯 C++ 条款 01:视 C++ 为一个语言联邦 为了理解 C++,必须认识其主要的次语言: C:C++ 仍以 C 为基础.很多时候,C++ 对问题的解法起始是较高级的 C 的解法(如 ...

  3. bitwise const和logic constness---龙之介《Effective C++》实验室

    条款3:尽可能使用const 1 bitwise const 成员函数如果是const意味着什么?有个所谓的bitwise const 的说法.即编译器认为,const成员函数不可以更改对象内任何no ...

  4. Effective C++ --1 让自己习惯C++

    1.视C++为一个语言联邦 C++主要的次语言有四种:C.Object-Oriented C++.Template C++和STL. 2.尽量以const,enum,inline替换#define ( ...

  5. effective c++_【阅读笔记】Effective C++()

    全文参考自Effective C++, Scott Meyers 程序来自本人 https://github.com/hxz1998/ccl 1. 让自己习惯C++ C++高效编程守则视状况而变化,取 ...

  6. Effective 笔记

    1,C++属于一个语言联邦 : C     Object-Oriented C++     Template C++       STL 2,应尽量以const,enum,inline替换#defin ...

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

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

  8. Effective C++学习第一天

    1:区分C++中的术语声明.定义.初始化的概念 声明(declaration):告诉编译器某个东西的名称和类型,但略去其他细节(可以出现多次,编译器不分配内存). 定义(definition):提供编 ...

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

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

最新文章

  1. css改变背景透明度
  2. VTK:线性挤压用法实战
  3. QT的QCameraImageProcessing 类的使用
  4. Java集合—Deque Stack
  5. python判断字符串在元祖_Python基础(2)——字典、元祖、字符串方法、非空即真、文件...
  6. 小程序·云开发实战 - 迷你微博
  7. Linux网络协议栈:网络包接收过程
  8. java 重力脚本_Java中非常简单的脚本解析器
  9. 预防AD对象被误删除
  10. Teradata 和Greenplum 的讨论
  11. [原] 让网页中的对话框不显示以前输入的信息
  12. “2019年全国职业院校技能大赛”高职组计算机网络应用竞赛竞赛样题B卷(软件定义网络部分答案参考)
  13. 力天创见客流统计分析系统
  14. js html 图片贴纸,Sticker.js 在网页实现便签贴纸效果 - 文章教程
  15. 离散数学 图论 部分笔记
  16. c语言忽略转义字符,C语言转义字符
  17. android 权限模型,android-棉花糖权限模型在Airbnb中的AccountManager getAccounts()异常,该怎么做?...
  18. 创新美学 自成风范 ,BMW 6系GT开启焕新旅程 悦享弘美新境
  19. 【图像去噪】基于小波阈值实现图像去噪matlab代码
  20. mysql 慢查询优化_MySQL 性能优化之慢查询

热门文章

  1. flowable画图教程_JeeGit企业级快速开发平台-JeeSite4 Flowable入门教程
  2. 先装vs还是先装sql_【家装话题】装修师先装门还是先装地板?
  3. 雷达的工作原理示意图_电磁阀的构成和工作原理示意图
  4. Wireshark常用过滤使用方法
  5. 什么是协议转换器?协议转换器的定义
  6. 【渝粤教育】国家开放大学2018年秋季 2202T公共行政学 参考试题
  7. 【渝粤教育】电大中专电大中专沟通技巧考试考核试题 (2)作业 题库
  8. 【渝粤题库】陕西师范大学202801 中国古代文学(五) 作业
  9. 【渝粤题库】广东开放大学 物业财税管理基础 形成性考核
  10. fanuc机器人与视觉通信_要说工厂干起活来:工业机器人和数控机床才是真正的一对!...