【C++学习笔记 15】C++中的const和mutable

const

const实际上更像一个假的关键字,因为它在代码中没有做什么,类似类和结构体的可见性,是一种针对开发人员写代码的强制规则。const基本上就是做出承诺,某些东西是不会改变的,这就意味着这个承诺并非强制。
在函数中的使用方法

#include <iostream>
#include <string>

int main() {
	const int MAX_AGE = 90;
	const int* a = new int;

	*a = 2;
	a = (int*)&MAX_AGE;
	std::cout << *a << std::endl;
	
	std::cin.get();
}

比如在这个例子中,*a会报错,意味着不能直接改变内容,但是后一句的强制转换类型并将地址赋值并未报错,这就是绕过承诺的方法之一。
如果一种写法:int* const a = new int;则情况刚好相反, *a不会报错,后一句报错。当在两个内容前都加上const时,则均不可改变。
在类中的使用方法

class Entity{
private:
	int m_X, m_Y;
public:
	int GetX() const
	{
		m_X = 2;
		return m_X;
	}
};

以一个类为例,当在方法的后面写const时,意味着这个方法无法改变实际的类,比如它无法修改类中的变量,方法中的赋值语句会报错。
如果遇到一种情况,或许是为了调试代码,想使用const方法,但其中有需要修改变量。这时,mutable关键字可以满足这种矛盾的需求。

mutable

const一起使用
假设我想要知道方法被调用的次数

#include <iostream>
#include <string>

class Entity{
private:
	std::string m_Name;
	mutable int m_DebugCount = 0;
public:
	const std::string& GetName() const {
		m_DebugCount++;
		return m_Name;
	}
};

int main() {
	const Entity e;
	e.GetName();
	
	std::cin.get();
}

加上mutable关键词就都跑的通了。
lambda中使用
lambda像一个一次性的小函数,可以写出来并赋值给一个变量

int x = 8;
auto f = [=]() mutable {
	x++;
	std::cout << x << std::endl;
	};

[ ]中的内容为引用的方式,等号意味着传值传递,此时如果不用mutable会使变量的运算报错,需要加上这个关键字,但它实际上做的事还是将值传递给中间变量,运算后再进行传递。这种写法会让代码干净很多。
值得一提的是,如果在函数外引用x,那它的值还会是8,因为是通过值进行的传递。


教程来源:The Cherno C++ 教程

  • 15
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值