0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C++中mutable关键字详解与实战

Android编程精选 来源:编程学习总站 作者:写代码的牛顿 2021-09-10 09:23 次阅读

mutable关键字详解与实战

C++中mutable关键字是为了突破const关键字的限制,被mutable关键字修饰的成员变量永远处于可变的状态,即使是在被const修饰的成员函数中。

在C++中被const修饰的成员函数无法修改类的成员变量,成员变量在该函数中处于只读状态。然而,在某些场合我们还是需要在const成员函数中修改成员变量的值,被修改的成员变量与类本身并无多大关系,也许你会说,去掉函数的const关键字就行了。可问题是,我只想修改某个变量的值,其他变量希望仍然被const关键字保护。

现在有个场景,我们想获取函数被调用的次数,代码如下:

class Widget{ public: Widget(); ~Widget() = default; int getValue() const; int getCount() const; private: int value; int count; };

这里我们想要获取getValue函数被调用次数,普遍的做法是在getValue函数里对成员变量count进行加1处理,可是getValue被关键字const修饰啊,无法修改count的值。这个时候mutable派上用场了!我们用mutable关键字修饰count,完整代码如下:

#include 《iostream》 class Widget{ public: Widget(); ~Widget() = default; int getValue() const; int getCount() const; private: int value; mutable int count; }; Widget::Widget() : value(1), count(0) { } int Widget::getValue() const{ count++; return value; } int Widget::getCount() const{ return count; } int main() { Widget w1; for(int i = 0; i 《 5; i++){ w1.getValue(); } std::cout 《《 w1.getCount() 《《 std::endl; return 0; }

被mutable修饰的成员变量count在getValue函数里进行加1计数,编译运行输出如下:

5

既保护了其他成员变量,又能达到我们单独修改成员变量count值的目的。

责任编辑:haq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

原文标题:C++ mutable关键字如何使用?

文章出处:【微信号:AndroidPush,微信公众号:Android编程精选】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    关键字搜索文件夹某个TXT文件

    文件夹随时创造TXT文件,如何及时选出刚创造的文件?或关键字搜索出需要的TXT文件?
    发表于 02-06 15:22

    在NVM和本地\"内存定义数组(静态 /global /local)的\"关键字是什么?

    在 NVM 和本地\"内存定义数组(静态 /global /local)的\"关键字是什么? 还有与 32 位对齐的关键字怎么样。
    发表于 01-25 07:52

    IAR能否在整个工程搜索关键字

    像mdk可以在整个工程搜索关键字 IAR应该也有类似的功能吧,但是我貌似没有找到
    发表于 11-08 07:21

    指向code区数组的指针需不需要加code关键字的声明?

    指向code区数组的指针需不需要加code 关键字的声明?
    发表于 11-02 06:16

    在嵌入式定义变量时volatile关键字的作用是什么?

    在嵌入式定义变量时volatile关键字的作用?
    发表于 10-24 07:50

    程序变量加volatile关键字是做什么用途的?

    为什么变量定义要加上这个关键字
    发表于 10-13 07:15

    this关键字在Java中的用法

    this 关键字只能在方法内部使用,表示对“调用方法的那个对象”的引用。 其实简单来说 this 关键字就是表示当前对象,下面我们来具体介绍 this 关键字在Java中的用法。 1、调用成员变量
    的头像 发表于 10-10 16:49 315次阅读
    this<b class='flag-5'>关键字</b>在Java中的用法

    C++中常用关键字详解(3)

    C++中,位域(bit fields)是一种特殊的数据结构,允许将结构体或类的成员变量按位进行分配。通过位域,可以有效地利用内存,节省存储空间,特别适用于表示布尔类型、标志位或其他不需要完整字节的数据。
    发表于 08-08 16:16 129次阅读

    C++中常用关键字详解(2)

    C++中,volatile是一个关键字,用于修饰变量,告诉编译器该变量的值可能在程序流程之外被意外修改,因此编译器不应该对该变量进行优化(如缓存变量值或重排指令顺序)。
    发表于 08-08 16:15 187次阅读

    C++ const、volatile和mutable关键字详解

    cv可出现于任何类型说明符中,以指定被声明对象或被命名类型的常量性(constness)或易变性(volatility)。
    的头像 发表于 07-18 16:49 387次阅读

    C语言关键字const的几种用法

    本期来讲解一个C语言的关键字——const。
    发表于 06-21 11:05 1006次阅读
    C语言<b class='flag-5'>关键字</b>const的几种用法

    const关键字应用总结

    C++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性
    的头像 发表于 05-26 09:06 365次阅读

    AT组件怎么解析无前缀关键字的数据?

    一开始想利用解析函数,at_resp_get_line,at_resp_parse_line_args等等去读取,单都需要关键字前缀匹配才行,且一次只能读一行。而我的数据是在下一行,且无前缀,所以我不知道要怎么读取这个data出来。 望各位大佬帮忙指点!感谢! 图如下:
    发表于 05-12 16:44

    ESP8266行号不会出现,关键字也不会突出显示是怎么回事?

    (codemirror.css.gz 和 codemirror.js.gz),当我单击 FileManager 时,这些文件出现在上传文件夹。但是行号不会出现,关键字也不会突出显示。我试过两个不同的模块
    发表于 04-26 07:14

    在ESPBASIC编程时是否有一些关键字可以在加载新程序之前清除当前内存?

    在 ESPBASIC 编程时是否有一些关键字可以在加载新程序之前清除当前内存?我在一个小程序做了修改,增加一行到两行,删除一两行,发现内存的当前程序全部搞砸了。当我对 ESP82
    发表于 04-26 07:09