对象地址(或指针)的转换问题?

疾似云流 2009-04-26 06:48:29

class Type;

int main()
{
Type obj;
int* p = (int*)&obj;
int* p2 = static_cast<int*>(&obj); //error
}


为什么第二句用static_cast会出错???
这是什么原因,该如何解决呢?
...全文
85 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
疾似云流 2009-04-28
  • 打赏
  • 举报
回复
惭愧啊~
谢谢了!
pathuang68 2009-04-26
  • 打赏
  • 举报
回复
请看看:
http://blog.csdn.net/pathuang68/archive/2009/04/26/4126489.aspx
你就全明白了。

1) static_cast
用法:static_cast <typeid> (expression)
说明:该运算符把expression转换为typeid类型,但没有运行时类型检查来确保转换的安全性。
用途:
a) 用于类层次结构中基类和派生类之间指针或者引用的转换。up-casting (把派生类的指针或引用转换成基类的指针或者引用表示)是安全的;down-casting(把基类指针或引用转换成子类的指针或者引用)是不安全的。
b) 用于基本数据类型之间的转换,如把int转换成char,这种转换的安全性也要由开发人员来保证。
c) 可以把空指针转换成目标类型的空指针(null pointer)。
d) 把任何类型的表达式转换成void类型。
注意: static_cast不能转换掉expression的const、volitale或者__unaligned属性。

2) reinterpret_cast
用法:reinterpret_cast <typeid>(expression)
说明:转换一个指针为其他类型的指针,也允许将一个指针转换为整数类型,反之亦然。这个操作符能够在非相关的类型之间
进行转换。操作结果只是简单的从一个指针到别的指针的值的二进制拷贝,在类型之间指向的内容不做任何类型的检查和转换。这是一个强制转换。使用时有很大的风险,慎用之。
注意:reinterpret _cast不能转换掉expression的const、volitale或者__unaligned属性。
deltamaster 2009-04-26
  • 打赏
  • 举报
回复
C++风格的类型转换就是为了方便区分转换的类型。
liliangbao 2009-04-26
  • 打赏
  • 举报
回复
static_cast用于将一个继承层次结构的转换,因此使用不对~
用reinterpret_cast~
baiwei156 2009-04-26
  • 打赏
  • 举报
回复

class Type
{};

int main()
{
Type obj;
int* p = (int*)&obj;
int* p2 = reinterpret_cast<int*>(&obj);


system("pause");
return 0;
}


测试通过
deltamaster 2009-04-26
  • 打赏
  • 举报
回复
使用reinterpret_cast。
baiwei156 2009-04-26
  • 打赏
  • 举报
回复
使用reinterpret_cast
baiwei156 2009-04-26
  • 打赏
  • 举报
回复
static_cast只能用来完成可以进行隐式转化的转换

65,211

社区成员

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

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