C++中的四种显式类型转换之const_cast、reinterpret
1、const_cast<type>(content)主要用于修改数据类型的const和volatile属性,
#include <string>
#include <iostream>
using namespace std;
class B
{
public:
int m_iNum;
B() {m_iNum=9;}
};
void foo()
{
const B b1;
//b1.m_iNum = 100; //compile error
B b2 = const_cast<B&>(b1);//const_cast中的type必须为指针或者引用,将常量对象转换成非常量对象,转换后不指向原来的对象。
/* 也可以做如下转换,体现出转换为指针类型 */
B *b3 = const_cast<B*>(&b1);//将常量指针转化为非常量指针,并且转换后仍指向原来的对象
/* 或者左侧也可以用引用类型,如果对b3或b4的数据成员做改变,就是对b1的值在做改变 */
B &b4 = const_cast<B&>(b1);//将常量引用转换为非常量引用,并且在转换之后得到的变量仍指向原来的对象
b2.m_iNum = 200; //这里是一个新的变量b2 对b2中的变量赋值不改变b1的值
cout<<b1.m_iNum<<endl; //输出9 b1中的值未变
b3->m_iNum=11;
cout<<b1.m_iNum<<endl;//输出11
b4.m_iNum=12;
cout<<b1.m_iNum<<endl;//输出12
}
int main(){
foo();
return 0;
}
const_cast<type>(content)主要有以下三种用法:
(1)将常量指针转化为非常量指针,并且转换后仍指向原来的对象;
(2)将常量引用转换为非常量引用,并且在转换之后得到的变量仍指向原来的对象;
(3)将常量对象转换成非常量对象,转换后的变量不指向原来的对象。
另外,const_cast中的type必须为指针或者引用。
2、reinterpret_cast<type>(content)他是c++中的强制类型转换,他允许从任何指针类型转换成其他任意指针类型,可以用于两个不相关类型之间的转换,但是这种转换比较危险,是一种不安全的转化机制。