概述:
类型转换(cast)是将一种数据类型转换成另一种数据类型。例如,如果将一个整型 值赋给一个浮点类型的变量,编译器会暗地里将其转换成浮点类型。 转换是非常 有用的,但是它也会带来一些问题,比如在转换指针时,我们很可能将其转换成一 个比它更大的类型,但这可能会破坏其他的数据。 应该小心类型转换,因为转换 也就相当于对编译器说:忘记类型检查,把它看做其他的类型。
无论什么原因,任何一个程序如果使用很多类型转换都值得怀疑. 标准 c++提供了一个显示的转换的语法,来替代旧的 C 风格的类型转换。 使用 C 风格的强制转换可以把想要的任何东西转换成我们需要的类型。那为什么还需要一 个新的 C++类型的强制转换呢? 新类型的强制转换可以提供更好的控制强制转换 过程,允许控制各种不同种类的强制转换。C++风格的强制转换其他的好处是,它 们能更清晰的表明它们要干什么。
静态转换:
#include <iostream>
#include <string>
using namespace std;
class A
{
public:
int a;
};
class B
{
public:
int b;
};
class C :public A
{
public:
int c;
};
void test01()
{
//static_cast 用来转化内置的数据类型,和C语言强转一样
int a = 1;
char b = 34;
double c = 245.34;
a = static_cast<int>(b);
a = static_cast<int>(c);
}
void test02()
{
A* p1 = new A;
B* p2 = new B;
C* p3 = new C;
//p1 = static_cast<A*>(p2);//不能转化没有发生继承关系的类
/*如果两个类之间发生了继承关系,可以类型转换,但是sattic_cast并不会保证安全性*/
p1 = static_cast<A*>(p3);//子转父是安全的,向上转化
//p3 = static_cast<A*>(p1);//父转子是向下转换是不安全的
delete p1;
delete p2;
delete p3;
}
void test03()
{
char* b = NULL;
int* a = NULL;
//a = static_cast<char*>(b);
}
int main()
{
test01();
return 0;
}
注意:
静态转换中static_cast
并不会保证安全性,对于普通变量是使用的时候像C语言的强制转换一样,但是static_cast
不能转换普通变量的指针test03
,如果是自定义变量的话,只有发生继承关系的类才能相互转换,并且只能向上转换,子对象指针转向父对象指针,因为不会发生指针指向的内存空间越界(大转小),不能父对象转子对象。
动态转化:
1,不能用于转换基本的数据类型
2,可以用于转换发生继承关系的类,保证转换是安全的
3,如果发生了多态,子转父和父转子总是安全的(虚函数表是动态绑定的,不会发生越界)
class A
{
public:
int a;
};
class B
{
public:
int b;
};
class C :public A
{
public:
int c;
};
//动态转换 dynamic_cast
void test04()
{
//动态转换不能转内置的基本数据类型
int a = 1;
char b = 2;
// a = dynamic_cast<int>(b);
}
void test05()
{
A* p1 = new A;
B* p2 = new B;
C* p3 = new C;
//子类转成父类
//不能用于发生继承关系之间的类
p1 = dynamic_cast<A*>(p3);
//父类转成子类是不安全的
//p3 = dynamic_cast<A*>(p1);
delete p1;
delete p2;
delete p3;
}
注:dynamic_cast转化只能转换发生继承关系的自定义数据类型,不能用来转内置类型(int ,char)等,并且转换时如果发生了父转子,就会报错,所以保证了安全性
常量转换:
该运算符用来修改类型的 const 属性。。 常量指针被转化成非常量指针,并且仍 然指向原来的对象; 常量引用被转换成非常量引用,并且仍然指向原来的对象;
注意:不能直接对非指针和非引用的变量使用 const_cast 操作符去直接移除它的 const.
void test06()
{
int* p1 = NULL;
const int* p2 = NULL;
//const不是基本的数据类型
p1 = const_cast<int*>(p2);
p2 = const_cast<const int*>(p1);//用来加const和去const
}
注意:const_cast
就是加const
和去const
但是只能地址状态操作。
重新解释转换
void test07()
{
int* p = NULL;
char* p2 = NULL;
p = reinterpret_cast<int*>(p2);
p2 = reinterpret_cast<int*>(p);
int c = 0;
c = reinterpret_cast<int>(p2);
}
注意:一般用来转换指针,整数等基本类型和指针之间也可以转换。
总结:
static_cast一般用来转换基本的数据类型;
dynamic_cast一般用来转换发生继承关系的自定义类型
const_cast 一般同来加const和去除const(地址访问的时候:引用和指针)