深入理解C++中的mutable关键字

2006-12-16 05:00 来源:BLOG 作者:寒星轩 责任编辑:方舟·yesky 评论(32)
        
        推荐:经典教程专区

  mutalbe的中文意思是“可变的,易变的”,跟constant(既C++中的const)是反义词。

  在C++中,mutable也是为了突破const的限制而设置的。被mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中。

  我们知道,如果类的成员函数不会改变对象的状态,那么这个成员函数一般会声明成const的。但是,有些时候,我们需要在const的函数里面修改一些跟类状态无关的数据成员,那么这个数据成员就应该被mutalbe来修饰。

  下面是一个小例子:

class ClxTest
{
 public:
  void Output() const;
};

void ClxTest::Output() const
{
 cout << "Output for test!" << endl;
}

void OutputTest(const ClxTest& lx)
{
 lx.Output();
}

  类ClxTest的成员函数Output是用来输出的,不会修改类的状态,所以被声明为const的。

  函数OutputTest也是用来输出的,里面调用了对象lx的Output输出方法,为了防止在函数中调用其他成员函数修改任何成员变量,所以参数也被const修饰。

  如果现在,我们要增添一个功能:计算每个对象的输出次数。如果用来计数的变量是普通的变量的话,那么在const成员函数Output里面是不能修改该变量的值的;而该变量跟对象的状态无关,所以应该为了修改该变量而去掉Output的const属性。这个时候,就该我们的mutable出场了——只要用mutalbe来修饰这个变量,所有问题就迎刃而解了。

  下面是修改过的代码:

class ClxTest
{
 public:
  ClxTest();
  ~ClxTest();

  void Output() const;
  int GetOutputTimes() const;

 private:
  mutable int m_iTimes;
};

ClxTest::ClxTest()
{
 m_iTimes = 0;
}

ClxTest::~ClxTest()
{}

void ClxTest::Output() const
{
 cout << "Output for test!" << endl;
 m_iTimes++;
}

int ClxTest::GetOutputTimes() const
{
 return m_iTimes;
}

void OutputTest(const ClxTest& lx)
{
 cout << lx.GetOutputTimes() << endl;
 lx.Output();
 cout << lx.GetOutputTimes() << endl;
}

  计数器m_iTimes被mutable修饰,那么它就可以突破const的限制,在被const修饰的函数里面也能被修改。

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

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

相关文章

my.ini优化mysql数据库性能的十个参数(推荐)

(1)、max_connections&#xff1a;允许的同时客户的数量。增加该值增加 mysqld 要求的文件描述符的数量。这个数字应该增加&#xff0c;否则&#xff0c;你将经常看到 too many connections 错误。 默认数值是100&#xff0c;我把它改为1024 。(2)、record_buffer&#xff1a;每…

sizeof(string)

2012-07-14 00:38:54| 分类&#xff1a; C | 标签&#xff1a; |字号大中小 订阅 今天看《程序员面试宝典》一书&#xff08;为了应付将要到来的微软笔试&#xff09;&#xff0c;看到了sizeof(string)这个问题。在Dev C上测试的结果是4&#xff0c;很不明白。上网搜了一下…

实现userdetails_Spring Security使用Hibernate实现自定义UserDetails

实现userdetails大多数时候&#xff0c;我们将要在Web应用程序中配置我们自己的安全访问角色。 这在Spring Security中很容易实现。 在本文中&#xff0c;我们将看到最简单的方法。 首先&#xff0c;我们将在数据库中需要以下表格&#xff1a; CREATE TABLE IF NOT EXISTS myd…

C++类内存结构布局

分类&#xff1a;C 2011-01-16 09:40 阅读(379)评论(0)编辑删除 一、没有虚函数&#xff0c;没有继承的类内存结构&#xff1a;1.如下定义一个类&#xff1a;class A{public:void seta(int x) {a x;}; void setb(int x) {b x;};int sum() {return ab;};private:int a;int b;…

使用Boxfuse为您的REST API设置https

在我的上 一篇 文章中&#xff0c;我展示了在Boxfuse的帮助下&#xff0c;基于Spring Boot框架建立REST API并在AWS上运行非常容易 。 下一步是利用SSL与API进行通信。 通过使用SSL&#xff0c;我们确保在REST API服务器和API客户端之间的传输过程中保存了数据 。 要为Spring B…

Python类与对象实验

一、任务描述 本实验任务主要对Python类与对象进行一些基本操作&#xff0c;通过完成本实验任务&#xff0c;要求学生熟练掌握Python类与对象的关系&#xff0c;并对Python类与对象的基本操作进行整理并填写工作任务报告。 二、任务目标 1、掌握Python类的创建 2、掌握类对象 三…

c++类的内存布局

by andydeng • 2011 年 4 月 3 日 • C • 1 Comment 本文基本上是对于Stanley B.Lippman的Inside The C Object Model一书第一章第三章的概括,描述了c类的内存布局情况. c的类的内存布局有如下规则: 1. Nonstatic data member 存放在Class Object中; 2. Static data membe…

matlab 五点三次平滑算法

(2012-04-23 21:01:31) 转载▼标签&#xff1a; 杂谈 分类&#xff1a; matlab http://www.ilovematlab.cn/thread-71818-1-1.html 这里提供一个函数mean5_3(五点三次平滑算法)对数据进行平滑处理&#xff1a; load V1.mat subplot 211; plot(V1); ylim([2000 7000]); grid; y…

spring配置xml文件_XML配置文件中的Spring配置文件

spring配置xml文件我的上一个博客非常简单&#xff0c;因为它涵盖了我从Spring 3.0.x到Spring 3.1.x的轻松升级&#xff0c;最后我提到可以将Spring模式升级到3.1&#xff0c;以利用Spring的最新功能。 在今天的博客中&#xff0c;我将介绍这些功能中最酷的功能之一&#xff1a…

数组指针和指针数组的区别

数组指针&#xff08;也称行指针&#xff09; 定义 int (*p)[n]; ()优先级高&#xff0c;首先说明p是一个指针&#xff0c;指向一个整型的一维数组&#xff0c;这个一维数组的长度是n&#xff0c;也可以说是p的步长。也就是说执行p1时&#xff0c;p要跨过n个整型数据的长度。 如…

用JS写的取存款功能

console.log("请输入用户名&#xff1a;");let username readline.question(); // 接收用户输入的用户名console.log("请输入密码&#xff1a;");let password readline.question(); // 接收用户输入的密码let arr [["123", "123…

您在2016年OpenStack峰会上错过的事情

今年我第一次参加了4月25日至29日在德克萨斯州奥斯汀举行的OpenStack峰会。 今天结束了&#xff0c;我要回家了&#xff0c;我想回顾一下&#xff0c;从我的角度分享你错过的事情。 作为以应用程序开发人员为重点的技术传播者&#xff0c;转移到包含Red Hat产品组合的基础架构…

HDU1069 最长上升子序列

emm。。。。矩形嵌套 还记得吗。。。。就是它。。。 直接贴代码了。。。。 import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.Scanner;public class Main{final static int maxn 1000000;…

linux 中配置假域名来测试

1.linux中配置假域名 找到hosts文件进行编辑 命令&#xff1a;vim /etc/hosts 配置&#xff1a; #centos&#xff08;本机IP&#xff09;192.168.1.179 www.imooc.com&#xff08;假域名&#xff0c;自己设置&#xff09;192.168.1.179 image.imooc.com192.168.1.179 s.imooc.c…

C/C++中的常量指针与指针常量

常量指针 常量指针是指向常量的指针&#xff0c;指针指向的内存地址的内容是不可修改的。 常量指针定义“const int *p&a;”告诉编译器&#xff0c;*p是常量&#xff0c;不能将*p作为左值进行操作。但这里的指针p还是一个变量&#xff0c;它的内容存放常量的地址&#xff0…

基于javafx的五子棋_JavaFX中基于表达式的PathTransitions

基于javafx的五子棋在JavaFX中&#xff0c;您可以使用PathTransition对象为路径上的节点设置动画。 PathTransitions使用Shape对象来描述它们需要沿其动画的路径。 JavaFX提供了各种类型的形状&#xff08;例如&#xff0c;多边形&#xff0c;圆形&#xff0c;多边形&#xff0…

ES6三种暴露方法

1.多行暴露&#xff08;分行暴露&#xff09; 导出 //test.js export function test1(){console.log(测试分别导出test1); } export function test2(){console.log(测试分别导出test2); } 导入&#xff1a; //index.js import {test1, test2} from ./test.js //文件路径二&…

shell获取当前执行脚本的路径

filepath$(cd "$(dirname "$0")"; pwd)脚本文件的绝对路径存在了环境变量filepath中&#xff0c;可以用echo $filepath查看完整路径在shell中&#xff1a;$0: 获取当前脚本的名称$#: 传递给脚本的参数个数$$: shell脚本的进程号$1, $2, $3...&#xff1a;脚…

MANIFEST.MF文件详解

参考百度百科的解释如下&#xff1a; http://baike.baidu.com/item/MANIFEST.MF MANIFEST.MF&#xff1a;这个 manifest 文件定义了与扩展和包相关的数据。单词“manifest”的意思是“显示” ### MANIFEST.MF文件介绍------------------------------ 主要包含3个部分 - Manifes…

Drools 6.4.0.Final提供

最新和最出色的Drools 6.4.0.Final版本现已可供下载。 这是我们先前构建的增量版本&#xff0c;对核心引擎和Web工作台进行了一些改进。 您可以在此处找到更多详细信息&#xff0c;下载和文档&#xff1a; Drools网站 资料下载 文献资料 发行说明 请阅读下面的一些发行要…