我们知道一个类型转化为const是很方便的,只需要在类型前加const
关键字就可以,但是如何去掉一个const类型参数的不可修改的属性呢?
const_cast的基本用法
主要作用是移除类型的const属性,常用于修改指针类型。
注意:
- 常量指针被转化成非常量的指针,并且仍然指向原来的对象;
- 常量引用被转换成非常量的引用,并且仍然指向原来的对象;
1. 基础数据类型去const
基础类型使用const_cast
转化有一个很特殊的特点,即常量展开。常量展开类似于宏定义,程序将会在编译的时候对变量进行了数值替换,这种特点只出现在基本类型的const变量中。
转化格式:const_cast<转换的类型>(被转换的变量名)
相关代码如下:
const int m = 10;
const_cast<int&>(m) = 100;
cout << m << " | " << *(&m) << endl;
// 不同的版本对*(&m)的处理不同
运行结果为:
我们发现变量m
和对m所在地址的内容*(&m)
是不同的,原因就是我们上述所说的常量展开,这也是为什么我们说const_cast
常用于指针类型转化。
2. 非基础数据类型去const
非基础类型去const就很好理解了,我们直接使用const_cast
进行转换就可以对参数进行修改了,接下来以一段代码为例。
代码如下:
const vector<int> vec = {1,2,3,4};
// vec[1] = 10;
const_cast<vector<int>&>(vec)[1] = 10;
for(auto n:vec){
cout << n << " ";
}
cout << endl;
输出内容如下,成功进行了修改:
注: 除此以外我们还可以在类中的成员函数中使用const_cast修改类中的成员变量,此时不会出现常量展开的情况,因为对于类中函数而言,其函数所传入的参数中是
this
指针。如下的代码中const_cast<int&>(m)
和const_cast<Test*>(this)->m
意义是相同的。
代码如下:
class Test{
mutable int m;
public:
void Print()const{
const_cast<int&>(m) = 100;
const_cast<Test*>(this)->m;
cout << m << endl;
}
};