C++中mutable关键字的用法

代码编译运行环境:VS2012+Win32+Debug


mutalbe的中文意思是“可变的,易变的”,是constant(即C++中的const)的反义词。在C++中,mutable也是为了突破const的限制而设置的。被mutable修饰的变量将永远处于可变的状态。

mutable的作用有两点: (1)保持长量对象中大部分数据成员仍然是“只读”的情况 下,实现对个别数据成员的修改。 (2)使const函数可修改对象的mutable数据成员。

使用mutable的注意事项: (1)mutable只能作用于类的非静态和非常量数据成员。 (2)在一个类中,应尽量或者不用mutable,大量使用mutable表示程序设计存在缺陷。

示例代码如下:

#include <iostream>
using namespace std;

//mutable int test;//编译出错

class Student{
    string name;
    mutable int getNum;
    //mutable const int test;    //编译出错
    //mutable static int static1;//编译出错
public:
    Student(char* name){
    this->name=name;
    getNum=0;
    }
    string getName()const {
        ++getNum;
        return name;
    }
    void pintTimes() const{
        cout<<getNum<<endl;
    }
};
int main(int argc, char* argv[])
{
    const Student s("张三");
    cout<<s.getName().c_str()<<endl;
    s.pintTimes();
    getchar();
    return 0;
}

程序输出结果: 张三 1

这里提个问题,mutable不能修饰const数据成员容易理解,因为mutable与const本是反义,同时修饰不是自相矛盾吗。但是为什么mutable不能修饰static数据成员呢?

因为static数据成员存储在全局静态存储区,属于类,不属于类对象,那么常对象和常函数对其可以任意的修改,所以类的static数据成员根本不需要mutable的修饰。但对于常对象的数据成员则不可以被修改,若想修改,则需要mutable的修饰。

示例代码如下:

#include <iostream>
using namespace std;

class Student{
    string name;    
public:
    static int test1;
    void modify() const{
        test1=15;
        cout<<test1<<endl;
    }
};

int Student::test1;//申明test1并按照编译器默认的值进行初始化
int main(int argc, char* argv[])
{
    const Student s("张三");
    s.test1=5;//常对象可以修改静态类的数据成员test1
    cout<<Student::test1<<endl;
    s. modify();//常函数修改
    getchar();
    return 0;
}

程序输出结果是: 5 15


参考文献

[1]C++高级进阶教程.陈刚.武汉大学出版社.

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏码云1024

c++ Struct和Class的区别

29430
来自专栏Golang语言社区

Go语言的指针 & *

Go语言保留着C中值和指针的区别,但是对于指针繁琐用法进行了大量的简化,引入引用的概念。所以在Go语言中,你几乎不用担心会因为直接操作内寸而引起各式各样的错误。...

29750
来自专栏微信公众号:Java团长

优秀Java程序员的编程风格

今天突发奇想,对编码习惯和编程风格很感兴趣,于是乎,找了一下关于编程风格(Java篇)的资料,希望对爱好编码或者开始学习编码的同学有帮助!

8220
来自专栏进击的君君的前端之路

设计模式

14320
来自专栏玄魂工作室

如何学python-第二课 基础输出/变量/变量类型

在python和其他主流的脚本语言里,有几样东西会在你在漫长的编程生涯里一直伴随着你——不外乎输出,变量,以及变量的类型。我们会从输出介绍起,然后是变量和变量的...

30570
来自专栏从零开始学自动化测试

python笔记17-字典按value排序

面试题:如何统计数组中出现次数最多的数据,按出现次数由大到小排序 这个排序看似简单,涉及到的基础知识点还是很多的,真正写起来并不容易

24110
来自专栏西枫里博客

Python学习笔记八(函数的定义和参数)

本次学习内容同样先回顾下上次学习的序列。然后学习今天的自定义函数部分。在编程中无论是面向过程还是面向对象,函数都是不可或缺的存在。什么是函数?这个问题在任何语言...

11220
来自专栏C/C++基础

C++IO流简介

输入输出(IO)是指计算机同任何外部设备之间的数据传递。常见的输入输出设备有文件、键盘、打印机、屏幕等。数据可以按记录(或称数据块)的方式传递,也可以 流的方式...

15230
来自专栏cloudskyme

设计模式(8)-状态模式(关注状态之间的变化)

状态模式(State Pattern)是设计模式的一种,属于行为模式。 定义(源于Design Pattern):当一个对象的内在状态改变时允许改变其行为,这...

37070
来自专栏韩伟的专栏

在C++中模拟JAVA内部类的方法

有时候我们需要把一批互相关联的API用不同的类提供给用户,以便简化每个类的使用难度。但是这样这些类之间的数据共享就成了问题。JAVA的内部类可以自由的访问外围类...

27440

扫码关注云+社区

领取腾讯云代金券