C风格的强制类型转换
Type b=(Type) a
c 风格的类型转换有不少的缺点,有的时候用 c 风格 的转换是不合 适的,因为它可以在任意类型之间转换,比如你可以把一个指向 const 对象的指针转换 成指向非 const 对象的指针,把一个指向基类对象的指针 转换成指向一个派生类对象的 指针,这两种转换之间的差别是巨大的,但是传统 的 c 语言风格的类型转换没有区分这 些。还有一个缺点就是,c 风格的转换不容 易查找,他由一个括号加上一个标识符组成, 而这样的东西在 c++程序里一大 堆。所以 c++为了克服这些缺点,引进了 4 新的类型转换操作符。
c++提供了4种类型转换,分别处理不同的场合应用
static_cast 静态类型转换
reinterpreter_cast 重新解释类型转换
dynamic_cast 子类和父类之间的多态类型转换
const_cast 去掉const属性转换
静态类型转换static_cast
static_cast<目标类型> (标识符)
只适合基础数据类型转换和转换具有继承关系的对象指针或引用
如 int a=1; char b=static_cast<char> (a);
转换具有继承关系的对象指针或引用:父类指针(引用)转子类指针(引用)或子类指针(引用)转父类指针(引用)都可以。
Animal * ani=NULL;
Cat* cat=static_cast<Cat*>(ani);
Cat* soncat=NULL;
Animal* anifather=static_<Aniaml*>(soncat);
Cat catobj;
Cat& catref=catobj;
Animal& anifather=static_cast<Animal&>(catref);
dynamic_cast 子类和父类之间的多态类型转换
只能转换具有继承关系的指针或者引用,在转换前会对象类型进行安全检查。
也就是说只能子类指针转父类指针。
父类指针转子类指针不安全,会报错。
dynamic_cast<目标类型> (标识符)
Cat* soncat=NULL;
Animal* anifather=static_<Aniaml*>(soncat);
Cat catobj;
Cat& catref=catobj;
Animal& anifather=static_cast<Animal&>(catref);
const_cast 去掉const属性转换
针对指针、引用、对象指针
等号左边一定要是指针或引用
#include <iostream>
using namespace std;
struct A {
int data;
};
int main(void)
{
A a = {200};
//A a1 = const_cast<A>(a);
a=static_cast<const A> (a);
const A& c=a;
A &a2 = const_cast<A&>(a); //减去const
a2.data = 400;
cout<<a.data<<a2.data<<endl;
A *a3 = const_cast<A*>(&a);
a3->data = 500;
cout<<a.data<<a3->data<<endl;
A b={100}; //增加const
const A &a4 = const_cast<const A&>(b);
const int x = 3;
int &x1 = const_cast<int&>(x);
x1 = 300;
cout<<x<<x1<<endl;
int *x2 = const_cast<int*>(&x);
*x2 = 400;
cout<<x<<*x2<<endl;
return 0; }
reinterpret_cast 强制类型转换
无关的指针类型,包括函数指针都可以进行转换。
如:typedef void(FUN1) (int,int);
typedef int(FUN2)(int,char*);
FUNC1 func1;
FUNC2 func2=reinterpret_cast<FUNC2> (func1);
建议1:
程序员要清除的知道: 要转的变量,类型转换前是什么类型,类型转换后
是什么类型。转换后有什么后果。
建议2: 一般情况下,不建议进行类型转换。