一.不同数据类型之间转换函数const_cast介绍
const_cast
是C++11中引入的一种类型转换操作符,用于修改类型的const
或volatile
属性。const_cast
的主要用途是移除对象的常量性,它是唯一具有此能力的C++风格的转型操作符。在C++11中,const_cast
可以完成以下类型转换:
- 常量指针转非常量指针:当有一个指向常量的指针时,可以使用
const_cast
将其转换为指向非常量的指针,这样就能够修改原来被指向的常量对象的值。- 常量引用转非常量引用:与指针类似,如果有一个指向常量的引用,可以使用
const_cast
将其转换为非常量的引用。- 多级指针的转换:两个可能指向同一类型的多级指针可以相互转换,而不考虑每一层上的
cv
性质(即const
和volatile
)。- 空指针值的转换:空指针值可以转换为新类型的空指针值。
需要注意的是,
const_cast
不是用于去除变量的常量性,而是用于去除指向常数对象的指针或引用的常量性。其去除常量性的对象必须为指针或引用。在使用const_cast
时,需要特别小心,因为虽然它可以去除const
属性,但这并不意味着原来的常量对象可以被修改,除非该对象本身并不是const
。此外,如果尝试修改一个真正的常量对象,将会导致未定义行为。
二. const_cast 使用示例
1.常量指针转非常量指针
#include <iostream>
int main() {
const int a = 10;
int* p = const_cast<int*>(&a);
*p = 20;
std::cout << "a: " << a << std::endl;
std::cout << "*p: " << *p << std::endl;
return 0;
}
运行结果:
2.常量引用转非常量引用
#include <iostream>
int main() {
const int a = 10;
const int& r = a;
int& nr = const_cast<int&>(r);
nr = 20;
std::cout << "a: " << a << std::endl;
std::cout << "r: " << r << std::endl;
std::cout << "nr: " << nr << std::endl;
return 0;
}
运行结果:
3. 空指针值的转换
#include <iostream>
int main() {
int* p = nullptr;
int** pp = const_cast<int**>(reinterpret_cast<const int**>(p));
std::cout << "pp: " << pp << std::endl;
return 0;
}
运行结果:
可以看到,通过
const_cast
将空指针值转换为新类型的空指针值后,得到的是一个空指针。需要注意的是,这里的转换使用了reinterpret_cast
进行类型转换,这是因为const_cast
不能直接将空指针值转换为非空指针类型。