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++ 教程