C++中如何可以修改const函数内的成员变量的值?

呵呵,你使用mutable关键字来定义变量就可以了。
下面举例说明

C++关键字mutable

Mutable

(1)mutable的意思是“可变的,易变的”,跟C++中的const是反义词。

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

实例说明:

复制代码
#include <iostream>
using namespace std;

class TestMutable
{
public:
TestMutable(){i=0;}
int Output() const
{
return i++; //error C2166: l-value specifies const object
}
private:
int i;
};

int main()
{
TestMutable testMutable;
cout<<testMutable.Output()<<endl;
return 0;
}
复制代码
显然i++在const修饰的函数里是编译通不过的。

复制代码
#include <iostream>
using namespace std;

class TestMutable
{
public:
TestMutable(){i=0;}
int Output() const
{
return i++;
}
private:
mutable int i;
};

int main()
{
TestMutable testMutable;
cout<<testMutable.Output()<<endl;
return 0;
}
复制代码
在 int i 前面加上 mutable上面就能编译通过了,马上可以看出关键字mutable的作用了。

时间: 2024-12-28 16:50:37

C++中如何可以修改const函数内的成员变量的值?的相关文章

在成员函数内定义static变量

成员函数内的局部变量可以是static的.如果将成员函数内的某个局部变量定义为静态变量,该类的所有对象在调用这个成员函数时将共享这个变量. 例3-40   本例在成员函数m中定义了一个static变量s,由于s定义在程序块内,它拥有程序块范围,因此它只能在m内部访问.每调用m一次,s就会相应地增加一次.又因为m是C的成员函数,所以,C的所有对象都共享这个静态局部变量.这样,对m的每一次调用访问的都是同一个s.相反,对于非静态局部变量x来说,每个C对象都拥有一个x.所以,在main中第一次调用c1

C++11类内static成员变量声明与定义

众所周知,将一个类内的某个成员变量声明为static型,可以使得该类实例化得到的对象实现对象间数据共享. 在C++中,通常将一个类的声明写在头文件中,将这个类的具体定义(实现)写在cpp源文件中. 因此,就引出了static成员变量的声明与定义问题: 1. 如果一个类内成员变量是static的,且需要将之设定为常量(const),那么这个变量声明与初始化均可写在头文件内. 举个例子: 1 // Scanner.hpp 2 class Scanner { 3 public: 4 const sta

Java中的null对象也可以访问static成员变量和方法

声明:本博客为原创博客,未经允许,不得转载!小伙伴们如果是在别的地方看到的话,建议还是来csdn上看吧(链接为 http://blog.csdn.net/bettarwang/article/details/26515271),看代码和提问.讨论都更方便. 一般来说,一个类的对象要在实例化之后才可以访问类中的成员变量和方法.如果它还是null,通常意义上我们就认为它不能访问类中的成员.实际上确实不提倡这样,而且null对象确实不能访问实例成员(变量和方法),否则会引发NULLPointerExc

Windows 如何在cmd命令行中查看、修改、删除与添加环境变量

转自:http://www.cnblogs.com/saptechnique/archive/2013/02/17/2914222.html 首先明确一点: 所有的在cmd命令行下对环境变量的修改只对当前窗口有效,不是永久性的修改.也就是说当关闭此cmd命令行窗口后,将不再起作用.永久性修改环境变量的方法有两种:一种是直接修改注册表(此种方法目前没试验过),另一种是通过我的电脑-〉属性-〉高级,来设置系统的环境变量(查看详细). 其次,明确一下环境变量的作用. 它是操作系统用来指定运行环境的一些

4、 C++函数内的静态变量初始化以及线程安全问题

原文:https://www.cnblogs.com/zxjan/p/3538911.html 1. 如果是编译时和加载时初始化, 是不会存在线程安全这个issue的; 因为这两种初始化一定发生在Main函数执行之前, 这个时候尚未进入程序运行空间; 而这些初始化一定是在单线程环境下操作的!  --  都是在执行C Runtime的startup代码中的void mainCRTStartup(void)函数时所在的OS系统加载程序时的主线程空间上发生的! 2. 如果是运行时初始化, 因为无法保证

C零基础视频-34-通过指针实现函数交换两个变量的值

目录 回顾:函数的值传递 使用指针交换两个变量的值 回顾:函数的值传递 因为函数的调用过程中,实参到形参是值传递,因此,改变形参,是无法影响到实参的: #include <stdio.h> void FakeSwap(int nArg1, int nArg2) { int nTemp = nArg1; nArg1 = nArg2; nArg2 = nTemp; } int main(int argc, char* argv[]) { int nValue1 = 100; int nValue2

函数复习及成员变量的属性扩展

public string selectC_code(int id) { string C_code = "<空>"; cmd.CommandText = "select C_code from Class where [email protected]"; cmd.Parameters.Clear(); cmd.Parameters.Add("@a",id); cnn.Open(); SqlDataReader read = cmd

C++内置类型的成员变量初始值的问题探讨

最近碰到个问题,C++内置类型的成员变量(如int)的默认初始值到底是多少? 我的开发环境:VIN7 64位,VS2010. 测试代码: class Solution { public: int a; char c; static int sb; }; Solution x; void main() { Solution s; void *pv = operator new(sizeof(Solution)); Solution *ps = new (pv)Solution(); Solutio

如何在 cmd 命令行中查看、修改、删除与添加环境变量

Windows 和 linux 区别 一.查看所有环境变量的名称和值:Linux下:exportWindows下:set二.根据名称查该环境变量的值:Linux下:echo $环境变量名比如:echo $ORACLE_HOMEWindows下:set 环境变量名 set path