请问static_cast,dynamic_cast和const_cast有什么区别?

yuexialinfeng 2005-01-20 07:24:23
最近学com经常看到,看了msdn还是有点不大清楚.
渴望大虾指点,感激不尽!
...全文
5536 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
daylove 2005-01-21
  • 打赏
  • 举报
回复
好 。
kylix2003 2005-01-20
  • 打赏
  • 举报
回复
好帖,受益匪浅!
oyljerry 2005-01-20
  • 打赏
  • 举报
回复
static_cast 类似强制类型转换
dynamic_cast 指针转换
yuexialinfeng 2005-01-20
  • 打赏
  • 举报
回复
我基本上明白了,谢谢楼上的几位.
问下:goodluckyxl(被人遗忘的狗)
你是zju的那个wishingbone么?
我看msdn做了下笔记.
======================================
这个例子说明,子类向基类转换.
class B { ... };
class C : public B { ... };
class D : public C { ... };

void f(D* pd)
{
C* pc = dynamic_cast<C*>(pd); // ok: C is a direct base class
// pc points to C subobject of pd

B* pb = dynamic_cast<B*>(pd); // ok: B is an indirect base class
// pb points to B subobject of pd
...
}

这个例子说明的是void*类型的向某一种类型的转换
其实这里不用dynamic_cast<type_id>也可以,他会隐士转换
class A { ... };

class B { ... };

void f()
{
A* pa = new A;
B* pb = new B;
void* pv = dynamic_cast<void*>(pa);
// pv now points to an object of type A
...
pv = dynamic_cast<void*>(pb);
// pv now points to an object of type B
}


这个例子说明自身类型转换主要是看它当前所直的对象和它将要转换的类型是否一致.而且这个一直是在程序运行中检测的.
class B { ... };
class D : public B { ... };

void f()
{
B* pb = new D; // unclear but ok
B* pb2 = new B;

D* pd = dynamic_cast<D*>(pb); // ok: pb actually points to a D
...
D* pd2 = dynamic_cast<D*>(pb2); //error: pb2 points to a B, not a D
// pd2 == NULL
...
}

下面是多重继承的,
这里我觉得有点奇怪,因为msdn上说从type D to type A,存在二义性.
但我觉得类型A就是一种啊,怎么会有二义性呢?
Class A
Class B : public A{….}
Class C: public A{….}
Class D: B,C;

void f()
{
D* pd = new D;
A* pa = dynamic_cast<A*>(pd); // error: ambiguous
B* pb = dynamic_cast<B*>(pd); // first cast to B
A* pa2 = dynamic_cast<A*>(pb); // ok: unambiguous
}

下面这个我就更有问题了.
Class A{….}
Class B: public A{……}
Class C:public A{……..}
Class D{……………}
Class E:public B,C,D{…….}
//这里是从父类到基类
void f(D* pd)
{
E* pe = dynamic_cast<E*>(pd);
B* pb = pe; // upcast, implicit conversion
A* pa = pb; // upcast, implicit conversion
}//这里从子类到父类,没用到dynamic_cast,也就是说,从子类到父类是可以不用这个的,我以前学C++的时候,觉得是可以不用dynamic_cast的,但必须要隐士转换.

下面这样转换都可以啊—cross cast!第一次看到.
void f(D* pd)
{
B* pb = dynamic_cast<B*>(pd); // cross cast
A* pa = pb; // upcast, implicit conversion
}

Static_cast
1.当类型从父类到子类转换时,不安全!
class B { ... };

class D : public B { ... };

void f(B* pb, D* pd)
{
D* pd2 = static_cast<D*>(pb); // not safe, pb may
// point to just B

B* pb2 = static_cast<B*>(pd); // safe conversion
...
}

2.用static_cast感觉好象是程序员要强制类型转换,是否安全就由程序员自己决定了.
typedef unsigned char BYTE

void f()
{
char ch;
int i = 65;
float f = 2.5;
double dbl;

ch = static_cast<char>(i); // int to char
dbl = static_cast<double>(f); // float to double
...
i = static_cast<BYTE>(ch);
...
}
现在我的认识就是:static_cast和dynamic_cast的区别主要在与,前者是静态检测类型,而后者是动态的.
goodluckyxl 2005-01-20
  • 打赏
  • 举报
回复
http://blog.csdn.net/goodluckyxl/archive/2005/01/19/259851.aspx
自己看看
FallenAngel 2005-01-20
  • 打赏
  • 举报
回复
dynamic_cast不让转,才用static_cast,然后用reinterpret_cast
const_cast是特殊情况
playmud 2005-01-20
  • 打赏
  • 举报
回复
static_cast会检查一下类型,给你一个警告。
如果static_cast不让转换那就dynamic_cast.如果再没招了,就renterpret_cast
playmud 2005-01-20
  • 打赏
  • 举报
回复
嗯,楼上的很清楚了,做个记号。
thomasnew 2005-01-20
  • 打赏
  • 举报
回复
dynamic_cast: 通常在基类和派生类之间转换时使用,run-time cast

const_cast: 主要针对const和volatile的转换.

static_cast: 一般的转换,no run-time check.通常,如果你不知道该用哪个,就用这个。

reinterpret_cast: 用于进行没有任何关联之间的转换,比如一个字符指针转换为一个整形数。

这些偏重于口语化解释,最好还是看看书,讲述标准c++的教材上都会有的。
Linux2001 2005-01-20
  • 打赏
  • 举报
回复
static_cast转换类似于C/C++里面的强制类型转换。
dynamic_cast转换是根据基类派生类的原则进行转换,把一个派生类转换为基类使用这个转换。
const_cast转换是去掉const变量的const

64,691

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧