在C++中,也提供了数据类型的强制类型转换,但方式与C不同,C中我们很容易把一种数据类型转换成另外一种数据类型,但在C++中,我们不提倡使用使用强制类型转换。C++中数据类型强制转换有四种转换的运算符,下面我来初步的介绍一下:
一 . static_cast<T>(cexpr) (T代表你将转换成的数据类型,cexpr是将要类型转换的变量名)
用途:用于所有普通基本类型转换,但不能用于基本类型的指针间的类型转换,可以用于继承关系对象之间的转换和类指针间的转换。
程序:
#include<iostream>
#include<iostream>
using namespace std;
class A
{
public:
int m_a;
};
{
public:
int m_a;
};
class B : public A
{
public:
int m_b;
};
{
public:
int m_b;
};
int main()
{
int x=1;
char y='b';
x=static_cast<int>(y);//普通类型之间转换。
int *px=&x;
char *py=&y;
// px=static_cast<int *>(py); //不能在普通指针之间进行转换。
A a;
B b;
a=static_cast<A>(b);//可以在继承关系的类之间进行转换
A *pa=&a;
B *pb=&b;
pa=static_cast<A *>(pb);//可以在有继承关系的类指针之间进行转换
pb=static_cast<B *>(pa);
return 0;
}
注意:static_cast是编译期进行转换的,无法在运行时检测类型。
二 . reinterpret_cast<T>(expr)
{
int x=1;
char y='b';
x=static_cast<int>(y);//普通类型之间转换。
int *px=&x;
char *py=&y;
// px=static_cast<int *>(py); //不能在普通指针之间进行转换。
A a;
B b;
a=static_cast<A>(b);//可以在继承关系的类之间进行转换
A *pa=&a;
B *pb=&b;
pa=static_cast<A *>(pb);//可以在有继承关系的类指针之间进行转换
pb=static_cast<B *>(pa);
return 0;
}
注意:static_cast是编译期进行转换的,无法在运行时检测类型。
二 . reinterpret_cast<T>(expr)
用途:(1).用于指针类型之间的强制类型转换。
(2).用于整数和指针类型之间的强制类型转换。
#include<iostream>
using namespace std;
int main()
{
int a=2;
char b='c';
int *pa=&a;
char *pb=&b;
pb=reinterpret_cast<char *>(pa);//用与普通指针类型转换。
return 0;
}
三 . const_cast<T>(rxpr)
#include<iostream>
using namespace std;
int main()
{
int a=2;
char b='c';
int *pa=&a;
char *pb=&b;
pb=reinterpret_cast<char *>(pa);//用与普通指针类型转换。
return 0;
}
三 . const_cast<T>(rxpr)
用途: 剥离一个对象的const属性,即转换后可以对常量进行修改。
#include<iostream>
using namespace std;
int main()
{
const int a=1; //相当于宏定义,后面的打印 a 都是1.
int &c=const_cast<int &>(a);
c=2;
cout<<a<<endl;
const int &b=3;
int &d=const_cast<int &>(b); //相当于d是b的一个别名引用,所有改变d就改变了b。
d=4;
cout<<b<<endl;
return 0;
}
四 . dynamic_cast<T>(expr)
用途:
(1)主要用于类层次间的转换,还可以用于类之间的交叉转换
(2)本运算符具有类型检查功能,比static_cast更安全。
#include<iostream>
using namespace std;
class A
{
public:
int m_a;
virtual ~A(){}
};
class B : public A
{
public:
int m_b;
};
int main()
{
A a;
B b;
A *pa=&a;
B *pb=&b;
pa=dynamic_cast<A *>(pb);// 继承关系派生类指针可以给基类指针,而且比static_cast更安全。
pb=dynamic_cast<B *>(pa);
return 0;
}