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进行修改呢?其实并不是,大致有两种方法可以对其进行修改:

  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函数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/351270.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机社团竞选优势6,社团社长竞选稿六篇

社团社长竞选稿六篇在社会一步步向前发展的今天&#xff0c;用到竞选稿的地方越来越多&#xff0c;竞选稿可以帮助竞选者更好地表达。还是对竞选稿一筹莫展吗&#xff1f;以下是小编为大家收集的社团社长竞选稿6篇&#xff0c;仅供参考&#xff0c;希望能够帮助到大家。社团社长…

使用Spring创建用于JUnit测试的JNDI资源

直到最近&#xff0c;我还使用静态方法来设置内存数据库&#xff08;HSQLDB&#xff09;。 我在JUnit测试的setUp / tearDown中调用了这些方法。 当我使用Spring时&#xff0c;这总是让我感到不自然&#xff0c;并且所有内容都应在其应用程序上下文中运行。 创建一个简单的JND…

安装Office Visio 提示Office 16 Click-to-Run Extensibility Component

今天在安装 Office Visio 2016 时&#xff0c;点击安装程序&#xff0c;出现以下错误&#xff1a; 出现这个问题的原因就是你的电脑以前安装过32位的office&#xff0c;卸载时&#xff0c;注册表没有清理干净。 解决方案&#xff1a; 在win10系统的左下搜索框内&#xff0c;输入…

加密安装Kli Linux

从U盘启动然后安装Kali是我们最喜欢并且是运行Kali最快(容易)的方法.为此,我们首先要把Kali的ISO克隆到U盘.如果你经常使用Kali Linux U盘,请在克隆前阅读完整的文档。 Kali Linux安装系列阅读&#xff1a; 用Live U盘安装Kali Linux http://www.linuxidc.com/Linux/2014-05/1…

hp服务器370G5硬盘列阵,hp DL380 g5创建raid阵列安装系统准备工作

RAID 1称为磁盘镜像&#xff0c;原理是把一个磁盘的数据镜像到另一个磁盘上&#xff0c;也就是说数据在写入一块磁盘的同时&#xff0c;会在另一块闲置的磁盘上生成镜像文件&#xff0c;在不影响性能情况下最大限度的保证系统的可靠性和可修复性上&#xff0c;只要系统中任何一…

服务器设备性能说明,OMC服务器硬件性能和配置说明.doc

OMC服务器硬件性能和配置说明PAGEOMC服务器硬件性能和配置说明TIME \ "yyyy年M月" \* MERGEFORMAT 2011年1月 PAGE 5目 录 TOC \t "Heading 1,1,Heading 2,2,Heading 3,4,Heading2 No Number,2,Heading3 No Number,3,About This Chapter,3,Subtitle,2" 第1…

编译错误syntax error : missing ';' before 'type'原因探寻

在VC6中运行以下代码 //main.c #include <stdio.h> int main() { chara[100]; memset(&a, 0, 100); charb; return 0; } / 编译器将会报一个编译错误&#xff0c; syntax error : missing ; before type 这个错误出在 char b; 这一行。 然后将程序改为 //…

谷歌guava_Google Guava BiMaps

谷歌guava接下来的番石榴之旅是另一个有用的收藏类型BiMap 。 实际上&#xff0c;这非常简单&#xff0c;BiMap只是双向地图。 反转地图 普通的Java映射是一组键和值&#xff0c;您可以按键查找值&#xff0c;这非常有用&#xff0c;例如&#xff0c;说我想创建一个&#xff0…

outlook设置263邮件服务器,大神详解win10系统怎么在Outlook中添加263邮箱的详细教程...

win10系统有很多人都喜欢使用,我们操作的过程中常常会碰到对win10系统怎么在Outlook中添加263邮箱的设置方法&#xff0c;想必大家都遇到过需要对win10系统怎么在Outlook中添加263邮箱进行设置的情况吧&#xff0c;那么应该怎么设置win10系统怎么在Outlook中添加263邮箱究竟该怎…

使用DynamoDB映射器将DynamoDB项目映射到对象

以前&#xff0c;我们使用Java创建了DynamoDB表。 对于各种数据库&#xff08;例如sql数据库或nosql&#xff09;&#xff0c;有一组工具可帮助访问&#xff0c;持久化和管理对象/类与基础数据库之间的数据。 例如&#xff0c;对于SQL数据库&#xff0c;我们使用JPA&#xff0…

linux 命令 find -exec 操作的问题

最近有这样一个需求&#xff0c;删掉某目录下的一些文件夹。其实就是名为“CVS”的文件夹&#xff0c;用过CVS的人都知道&#xff0c;CVS会在目录的每一级建立一个名为CVS的文件夹&#xff0c;里面放着CVS相关信息&#xff0c;我需要将某目录下所有的名为“CVS”的文件夹删掉。…

雷林鹏分享:C# 运算符

C# 运算符 运算符是一种告诉编译器执行特定的数学或逻辑操作的符号。C# 有丰富的内置运算符&#xff0c;分类如下&#xff1a; 算术运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 杂项运算符 本教程将逐一讲解算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符及…

思科服务器 vmware虚拟多少个hba卡,利用Cisco UCS 管理虚拟机网络(上)

Cisco UCS计算系统针对虚拟化环境的网络管理提供了两种解决方案&#xff1a;一种是纯软件的Cisco Nexus 1000V&#xff1b;一种是基于Cisco UCS M81KR网卡的硬件解决方案。Cisco Nexus 1000V是唯一的第三方分布式虚拟交换机&#xff0c;同样实现了交换机的数据功能和控制功能的…

Pycharm的远程代码编辑

作为一个从Java转到Python的程序猿&#xff0c;一直觉得python的远程代码调试能力不如java&#xff0c;远程调试一把需要各种改代码&#xff0c;牵扯到eventlet库的时候&#xff0c;问题就更严重&#xff0c;需要调整eventlet的各种配置&#xff0c;算了还是不用远程调试了&…

L3-020 至多删三个字符 [DP]

这题在网上看到一个非常容易理解的思路&#xff0c;和大家分享一下。 记dp[i][j]为前i个字符删除j个字符后得到不同字符串的数量&#xff0c;可以得到以下两个转移方程 dp[i][j1]dp[i][j1]dp[i-1][j] (删除s[i]) dp[i][j]dp[i][j]dp[i-1][j] (不删除s[i]) 如果只用上述式子&…

idea中使用osgi_OSGi中的权限

idea中使用osgi在上一篇文章中 &#xff0c;我们介绍了为Java应用程序实现沙箱的方法&#xff0c;在其中我们可以安全地运行移动代码 。 这篇文章探讨了如何在OSGi环境中执行相同的操作。 OSGi OSGi规范 为Java定义了一个动态模块系统 。 因此&#xff0c;它是实施那种可以使…

我的世界末日之后无限法则服务器,《我的世界》全新玩法无限法则上线

完整细致的世界体系&#xff0c;丰富多样的地图&#xff0c;拥有无限探索可能的新世界欢迎你的到来。春节期间&#xff0c;《我的世界》手游全新玩法《无限法则》重磅上线&#xff0c;带大家一同体验无限创造的魅力。冒险家们&#xff0c;一起开启新世界的冒险之旅吧&#xff0…

python风流史

python的创始人为吉多范罗苏姆&#xff08;Guido van Rossum&#xff09;。1989年的圣诞节期间&#xff0c;吉多范罗苏姆&#xff08;中文名字&#xff1a;龟叔&#xff09;为了在阿姆斯特丹打发时间&#xff0c;决心开发一个新的脚本解释程序&#xff0c;作为ABC语言的一种继承…

将Infinispan版本映射为最低Java版本

我最近一直在与Infinispan交流 &#xff0c;我注意到这种“分布式内存键/值数据存储”的特征之一是它相对积极地采用&#xff0c;甚至要求更高版本的Java。 根据参考的Infinispan文档 &#xff0c;以下内容将Infinispan版本映射到最低必需的Java SE版本。 Infinispan版本及其…

python 在不同层级目录import 模块的方法

http://www.cnitblog.com/seeyeah/archive/2009/03/15/55440.html Python包含子目录中的模块方法比较简单&#xff0c;关键是能够在sys.path里面找到通向模块文件的路径。 下面将具体介绍几种常用情况: &#xff08;1&#xff09;主程序与模块程序在同一目录下: 如下面程序结构…