首页 > 代码库 > Regular cast vs. static_cast vs.dymamic_cast in C++

Regular cast vs. static_cast vs.dymamic_cast in C++

介绍C++类型转换的用法。

1.static_cast

static_cast用与强制隐式类型转换,即隐式类型转换的反方向。static_cast,限制条件少,不进行运行时检验。

必须用于当你知道对象的具体类型时,这样检验是不必要的,否则,不安全。

example:

 

void func(void *data) {  // Conversion from MyClass* -> void* is implicit  MyClass *c = static_cast<MyClass*>(data);  ...}int main() {  MyClass c;  start_thread(&func, &c)  // func(&c) will be called      .join();}


在这个例子中,你已经知道传入的是一个MyClass 对象,没有必要进行运行时检验。

 

如果将一个非MyClass 对象传入func中,会如何呢,看下面code,

 

#include<iostream>using namespace std;class A{	public:		A()		{			i=0;			j=12;		}		int i;		int j;};void cast_f(void *ptr){	A * p=static_cast<A *>(ptr);	cout<<p->i<<endl;	cout<<p->j<<endl;} int main(){	int a=11;	int * p=&a;	cast_f(p);	cin.get();	return 0;}

输出11和一个未知数。而不是0和12。 这就要我们确保已知传入的对象类型。否则,不安全。

 

2.dynamic_cast

dynamic_cast用在当你不知道对象的动态类型是什么的时候,而你想在一个你认定为继承类对象身上执行继承类的操作函数,但你的手上却只有一个指向基类对象的指针或者引用。若为downcast并且类型参数不为多态时,不能使用dynamic_cast,编译器报错。

dynamic_cast 返回一个null指针,如果对象的类型不是以将要转换为的类型为基类的话。即,非派生类对象转为基类对象,或者基类对象转为派生类对象,均返回null指针。

 

 

#include<iostream>using namespace std;class A{	public:		virtual void f(){			cout<<"A"<<endl;		}};class B:public A{	public:	void dynamic_f()	{		cout<<"called dynamic_f()"<<endl;	} };int main(){	A a;	B *b=dynamic_cast<B *>(&a);//when downcast, if a is not object of class B,return null pointer.	if(!b)	{		cout<<"null"<<endl;	}	else	{		cout<<"not null"<<endl;	}	A *aa=0;//基类指针 	B bb;	aa=&bb;//指向派生类	//aa如何调用dynamic_f()呢? aa.dynamic_f()当然不行了,编译不通过	B *ba=dynamic_cast<B*>(aa);	ba->dynamic_f();	cin.get();	return 0;}



 

这个例子中,将基类对象转换为派生类对象,返回一个null指针。

 

up-cast(向上转换)是隐式转换,对static_cast,dynamic_cast,without any cast均有效。

3.Regular cast

Regular cast 又称为C风格类型转换。C-style cast,结合const_cast,static_cast,reinterpret_cast,但是它是不安全的,因为不支持dynamic_cast。

通常在数字转换时用C-style cast,其他用c++风格的cast。另外,c++风格的更易读。