C++强制类型转换
标准C++为了加强类型转换的可视性,引入了四种命名的强制类型转换操作符:
static_cast、reinterpret_cast、const_cast、dynamic_cast
#include<iostream>
using namespace std;
int main()
{
int i = 1;
double d = 6.66;
//c---隐式转换
i = d;
cout << i << endl;//6
//c---显式转换
int* p = nullptr;
p = (int*)i;
cout << p << endl;//6
//c++---c>隐式转换
d = static_cast<double>(i);
cout << d << endl;//6
//c++---c>显式转换
p = reinterpret_cast<int*>(i);
cout << p << endl;//6
//const_cast --- 去const属性
const int ci = 10;
int* pi = const_cast<int*>(&ci);
*pi = 20;
cout << *pi << endl;//20
//编译器对const对象存取优化导致---内存中ci为20寄存器中ci为10
cout << ci << endl;//10
//防止优化,让编译器从内存中取值
volatile const int ci = 10;
int* pi = const_cast<int*>(&ci);
*pi = 20;
cout << *pi << endl;//20
cout << ci << endl;//20
return 0;
}
//注:dynamic_cast向下转换只能针对继承中的多态类型(父类必须包含虚函数)
///
class A {
public:
virtual void f()
{}
int _a;
};
class B : public A
{
public:
int _b;
};
void f_cast(A* pa)
{
//如何判断pa是指向父类对象还是指向子类对象???
//dynamic_cast ---若pa指向子类对象,则转换成功
// ---若pa指向父类对象,则转换失败,并返回nullptr
//B* pb = (B*)pa;
B* pb = dynamic_cast<B*>(pa);
if (pb != nullptr)
{
cout << "转换成功: pa指向子类对象" << endl;
pb->_a = 1;
pb->_b = 2;
}
else
{
cout << "转换失败: pa指向父类对象" << endl;
}
}
//注:dynamic_cast向下转换只能针对继承中的多态类型(父类必须包含虚函数)
A a;
B b;
A* pa = &a;
//f_cast(pa);
pa = &b;
f_cast(pa);
向上转换:
c++中子类对象可以赋值给父类的对象,指针,引用,这个过程会发生切片,语法天然支持,不然可以转换成功。
向下转换:
如果是父类的指针或引用,传给子类的指针,这个过程不一定成功。