C++ Mutable

2023-05-16

1、mutable 含义及常规使用

mutable 英文中表示,易变的,不定的;性情不定的,而在代码中表示 可变数据成员

由前面整理的 const详解 知道,由const修饰的成员函数中,不能对成员变量进行修改,因为隐藏的形参是 const 属性的。

而实际开发过程中,我们可能需要对某些成员变量进行修改,就需要用到 mutable。

class constA
{
public:
	constA(int a):m_a(a){}
	void funcA() const { cout << ++m_a << endl; }

	mutable int m_a;
};

main.cpp

	constA ab(10);
	ab.funcA();

	const constA abc(11);
	abc.funcA();
	abc.m_a = 15;
	abc.funcA();

输出
	11
	12
	16

这里可以看到在const的成员函数中,可以对mutable修饰的变量进行修改。 而对于const对象,它的成员变量依然可以进行修改。

总结一句话:一个 可变数据成员,永远不会是const,即使它是const 对象的成员

2、用于lambda表达式

前面整理的lambda表达式及其原理 时我们知道,在lambda捕捉列表 [ = ] 采用 传值方式捕捉外部变量 时,编译器将该表达式翻译成一个未命名类的未命名对象。该类含有一个经过const 修饰放入重载调用运算符。如下:

int func()
{	
	int a =10;
	int b = 20;
	auto addfun = [=] (const int c ) -> int { return a+c; };
	
	int c = addfun(b);    
	cout << c << endl;
};

等同于

class Myclass
{
public:
	Myclass( int a ) : m_a(a){};	//该形参对应捕获的变量
	
	//该调用运算符的返回类型、形参和函数体都与lambda一致
	int operator()(const int c) const
	{
		return a + c;
	}
	
private:
	int m_a;		//该数据对应通过值捕获的变量
};

而加入 mutable后,相当于把 operator 的 const 修饰去掉,这样就可在函数内部对 传值方式捕捉的变量进行修改。具体书写方式如下:

[capture list] (parameter list)  mutable  -> return type {function body}

3、和const_cast 比较

前面整理的C++强制类型转换 时,const_cast<type>(expression) 可以 改变表达式中的常量性或易变性

而他两个的区别在于:
1、const_cast 中的 type 必须是指针或者引用
2、mutable 一般只用于成员变量和lambda表达式

好了就整理到这了

感谢大家,我是假装很努力的YoungYangD(小羊)

参考资料:
《C++ primer 第五版》

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ Mutable 的相关文章

  • C++ Mutable

    1 mutable 含义及常规使用 mutable 英文中表示 xff0c 易变的 xff0c 不定的 xff1b 性情不定的 xff0c 而在代码中表示 可变数据成员 由前面整理的 const详解 知道 xff0c 由const修饰的成员
  • 我如何处理/规避 Rust 中的“无法分配给……位于 & 引用后面”?

    我会实现一个简单的链表 这是我到目前为止的 工作 代码 pub struct LinkedList
  • Swift - 如何在迭代结构对象时改变它

    我仍然不确定结构复制或引用的规则 我想在从数组迭代结构对象时改变它 例如在这种情况下我想改变背景颜色 但编译器对我大喊大叫 struct Options var backgroundColor UIColor blackColor var
  • 更新可变 HashMap 值,这是一个可变集合

    我有一张如下所示的地图 Map A gt Collection B 该映射会循环更新 然而 特殊之处在于 更新主要意味着将元素 B 添加到 Collection B 对于某些键 A 我试图找出是否可以通过将 Collection 的类型从
  • 为什么可变结构是“邪恶的”?

    在关于 SO 的讨论之后 我已经多次阅读了可变结构是 邪恶的 的评论 就像在这个问题的答案中一样 question C 中的可变性和结构的实际问题是什么 结构是值类型 这意味着它们在传递时会被复制 因此 如果您更改副本 您只会更改该副本 而
  • ImmutableObject 属性有什么好处?

    我正在测试ImmutableObjectAttribute属性只是出于好奇 想看看应用它是否可以获得一些好处 或者它是否只是为了语义装饰 不可变对象属性类 指定对象没有可编辑的子属性 所以我有这样的课程
  • 将“mut”放在变量名之前和“:”之后有什么区别?

    以下是我在 Rust 文档中看到的两个函数签名 fn modify foo mut foo Box
  • Java 是否有 Integer、Float、Double、Long 的可变类型?

    我现在的情况是想使用 Integer 之类的可变版本 我必须使用这些类 如下 还是 Java 有内置的东西 http www java2s com Code Java Data Type Amutableintwrapper htm htt
  • 项目 Euler 7 Scala 问题

    我试图使用 scala 2 8 解决 Project Euler 问题 7 我实施的第一个解决方案大约需要 8 秒 def problem 7 Int var num 17 var primes new ArrayBuffer Int pr
  • Python 中的可变和不可变

    我是 Python 新手 试图理解可变对象和不可变对象之间的区别 Python 中的可变类型之一是列表 假设 L 1 2 3 那么 L 有一个指向对象 1 2 3 的 id 如果 1 2 3 的内容被修改 那么L仍然保留相同的id 换句话说
  • 可变对象与不可变对象

    我正在尝试了解可变对象与不可变对象 使用可变对象会受到很多负面影响 例如从方法返回字符串数组 但我很难理解这样做的负面影响 使用可变对象的最佳实践是什么 您应该尽可能避免它们吗 嗯 这有几个方面 没有引用标识的可变对象可能会在奇怪的时候导致
  • 在 C++ 中缓存昂贵的数据 - 函数范围的静态与可变成员变量

    我有一个相对昂贵的数据获取操作 我想缓存其结果 这个操作是从调用的const方法 大致是这样的 double AdjustData double d int key const double factor LongRunningOperat
  • 使用可变引用迭代递归结构并返回最后一个有效引用

    我正在尝试递归节点结构 修改它们 然后返回最后一个Node我能做到的 我使用循环中的可变引用解决了问题非词汇生命周期 RFC 中的示例 https github com rust lang rfcs blob master text 209
  • 字符串数组是可变的吗?

    我想知道Java中的字符串数组是否是可变的 我知道字符串是不可变的 但是字符串数组怎么样 如果我有一个字符串数组 并更改内容 是否会创建一个新的字符串对象 或者实际值会改变吗 提前致谢 The Strings 包含在String 确实是不可
  • 除了允许 const 成员函数修改数据成员之外,“mutable”关键字还有其他用途吗?

    不久前 我遇到了一些代码 用以下标记标记了类的数据成员mutable关键词 据我所知 它只是允许您修改const 合格会员方法 class Foo private mutable bool done public void doSometh
  • 如何在结构字段上创建可变迭代器

    所以我正在使用 Rust 开发一个小型 NES 模拟器 并且我正在尝试使用我的状态寄存器 寄存器是一个结构体 其中包含一些包含布尔值的字段 标志 寄存器本身是 CPU 结构体的一部分 现在 我想循环这些字段并根据我执行的某些指令设置布尔值
  • Swift(UI) 错误:无法在不可变值上使用变异成员:“self”是不可变的

    基本上我想做的是 如果您按下按钮 那么条目应该获得一个新的 CEntry 如果有人能帮助我那就太好了 谢谢 struct AView View var entries CEntries var body some View ZStack V
  • Python 中的可变字符串

    你知道有一个提供可变字符串的 Python 库吗 谷歌返回的结果出奇的少 我发现的唯一可用的库是http code google com p gapbuffer http code google com p gapbuffer 它是用 C
  • 从 using 语句中修改值类型是否是未定义的行为?

    这确实是一个分支这个问题 https stackoverflow com questions 4642665 why does capturing a mutable struct variable inside a closure wit
  • 带有参考的 Haskell 数据类型

    我正在实现 Ukkonen 的算法 该算法要求树的所有叶子都包含对同一整数的引用 并且我在 Haskell 中执行此操作是为了了解有关该语言的更多信息 但是 我很难编写出执行此操作的数据类型 Node has children indexe

随机推荐