Advanced C++ -- Logic Constness and Bitwise Constness
首先介绍一下什么是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进行修改呢?其实并不是,大致有两种方法可以对其进行修改:
- 使用mutable,在变量前面使用mutable进行修饰,这样就可以在const修饰的函数中进行修改。
- 还有一种C++方式,但是并不推荐的就是,使用const_cast对变量的const属性进行cast,这样就可以进行修改而不报错,但是此方法还是不推荐的,实际上在实际开发中,const修饰function的目的就是控制其不能修改变量值。
再解答一下Quiz的一长串const修饰到底意味着什么:
- func的返回值为const的int值,其值为const,指针也为const,表示value和pointer都不可更改
- func的参数是一个指向const integer的const指针的引用
- func也是一个const function,说明不能直接对类中的变量进行修改,并且只能调用其他const函数
Advanced C++ -- Logic Constness and Bitwise Constness相关推荐
- 【Effective C++】总结
文章目录 一.自己习惯c++ 视c++为一个语言联邦 尽量以 const,enum,inline 替换 #define 尽可能使用const 确定对象初始化 二.构造,析构,赋值 了解c++默默编写并 ...
- Effective C++ 01 让自己习惯 C++
1. 让自己习惯 C++ 条款 01:视 C++ 为一个语言联邦 为了理解 C++,必须认识其主要的次语言: C:C++ 仍以 C 为基础.很多时候,C++ 对问题的解法起始是较高级的 C 的解法(如 ...
- bitwise const和logic constness---龙之介《Effective C++》实验室
条款3:尽可能使用const 1 bitwise const 成员函数如果是const意味着什么?有个所谓的bitwise const 的说法.即编译器认为,const成员函数不可以更改对象内任何no ...
- Effective C++ --1 让自己习惯C++
1.视C++为一个语言联邦 C++主要的次语言有四种:C.Object-Oriented C++.Template C++和STL. 2.尽量以const,enum,inline替换#define ( ...
- effective c++_【阅读笔记】Effective C++()
全文参考自Effective C++, Scott Meyers 程序来自本人 https://github.com/hxz1998/ccl 1. 让自己习惯C++ C++高效编程守则视状况而变化,取 ...
- Effective 笔记
1,C++属于一个语言联邦 : C Object-Oriented C++ Template C++ STL 2,应尽量以const,enum,inline替换#defin ...
- effective C++ 条款 3:尽可能使用const
const 修饰指针:如果关键字const出现在星号*左边,表示被指物是常量,如果const出现在*右边表示指针自身是常量, 如果出现在两边表示被指物和指针都是常量: const std::vecto ...
- Effective C++学习第一天
1:区分C++中的术语声明.定义.初始化的概念 声明(declaration):告诉编译器某个东西的名称和类型,但略去其他细节(可以出现多次,编译器不分配内存). 定义(definition):提供编 ...
- Effective C++ 条款03:尽可能使用const
场景一 用于修饰指针 char greeting[] = "Hello"; char* p = greeting; // non-const pointer, non-const ...
最新文章
- css改变背景透明度
- VTK:线性挤压用法实战
- QT的QCameraImageProcessing 类的使用
- Java集合—Deque Stack
- python判断字符串在元祖_Python基础(2)——字典、元祖、字符串方法、非空即真、文件...
- 小程序·云开发实战 - 迷你微博
- Linux网络协议栈:网络包接收过程
- java 重力脚本_Java中非常简单的脚本解析器
- 预防AD对象被误删除
- Teradata 和Greenplum 的讨论
- [原] 让网页中的对话框不显示以前输入的信息
- “2019年全国职业院校技能大赛”高职组计算机网络应用竞赛竞赛样题B卷(软件定义网络部分答案参考)
- 力天创见客流统计分析系统
- js html 图片贴纸,Sticker.js 在网页实现便签贴纸效果 - 文章教程
- 离散数学 图论 部分笔记
- c语言忽略转义字符,C语言转义字符
- android 权限模型,android-棉花糖权限模型在Airbnb中的AccountManager getAccounts()异常,该怎么做?...
- 创新美学 自成风范 ,BMW 6系GT开启焕新旅程 悦享弘美新境
- 【图像去噪】基于小波阈值实现图像去噪matlab代码
- mysql 慢查询优化_MySQL 性能优化之慢查询
热门文章
- flowable画图教程_JeeGit企业级快速开发平台-JeeSite4 Flowable入门教程
- 先装vs还是先装sql_【家装话题】装修师先装门还是先装地板?
- 雷达的工作原理示意图_电磁阀的构成和工作原理示意图
- Wireshark常用过滤使用方法
- 什么是协议转换器?协议转换器的定义
- 【渝粤教育】国家开放大学2018年秋季 2202T公共行政学 参考试题
- 【渝粤教育】电大中专电大中专沟通技巧考试考核试题 (2)作业 题库
- 【渝粤题库】陕西师范大学202801 中国古代文学(五) 作业
- 【渝粤题库】广东开放大学 物业财税管理基础 形成性考核
- fanuc机器人与视觉通信_要说工厂干起活来:工业机器人和数控机床才是真正的一对!...