C++ casts那些事儿
C/C++编译器类型隐式转换我想大家都一定很熟悉了。写C++的程序,要么是依靠编译器进行类型隐式转换,要么自己显示将类型进行转换,但是很少用到cast。最近看到一些代码经常使用cast来进行显示转换。自己研究下,发现cast这东西还是很有意思。
C++中cast关键字有:static_cast, dynamic_cast, const_cast, reinterpret_cast四种
cast的语法:
cast-name<type>(expressiong)
后面的expression不管是一个变量还是一个表达式,都需要使用括号。
const_cast:
将const变量转换成非const变量
#include <iostream> using namespace std; void func(char *str){ /... } int main(){ const char *mystr = "hello tan haiyan"; func(mystr); }
上面这段代码肯定会编译报错。无法将const char * 转换成char *
这个时候const_cast就可以起到作用了:
作出以下更改之后,就没问题了。
#include <iostream> using namespace std; void func(char *str){ /... } int main(){ const char *mystr = "hello tan haiyan"; func(const_cast<char *>(mystr)); }
只有const_cast才具有将const转换成非const类型
static_cast:
显示类型转换。这种cast的主要目的是让程序员和编译器知道这段代码作出的转换就是我想要的结果而不是失误或者偶然,这样可以去掉编译器误认为是因为程序员操作失误而产生的类型转换的警告。
double d_data = 3.14; int i_data = static_cast<int>(d_data);//这样显示转换,编译器不会有警告
double d_data = 3.14 void *ptr = &d_data /** 如果我们已经知道void 指针指向的是一个double数据。我们就可以作出这种强制转换*/ double *ptmp_data = static_const<double *>(ptr);
reinterpreter_cast:
reinterpreter_cast比较不好理解。它只进行一种简单的bit位复制而不进行二进制数据分析。
这种盲目的复制而不进行数据分析的强制转换在使用过程中一定要谨慎。
/** 仅仅是简单的复制了n的bit位到变量d,不进行任何数据分析 */ int n=9; double d=reinterpret_cast<double & > (n);
dynamic_cast:
除了转换之外,多了一步安全检查,检查转换是否可行。依赖于RTTI
struct A { virtual void f() { } }; struct B : public A { }; struct C { }; void f () { A a; B b; A* ap = &b; B* b1 = dynamic_cast<B*> (&a); // NULL, because 'a' is not a 'B' B* b2 = dynamic_cast<B*> (ap); // 'b' C* c = dynamic_cast<C*> (ap); // NULL. A& ar = dynamic_cast<A&> (*ap); // Ok. B& br = dynamic_cast<B&> (*ap); // Ok. C& cr = dynamic_cast<C&> (*ap); // std::bad_cast }
版权申明:
转载文章请注明原文出处http://blog.csdn.net/feiyinzilgd/archive/2010/12/30/6108417.aspx
并请联系谭海燕 本人或者前往谭海燕个人主页 留言