Qt 中static_cast 和 reinterpret_cast的区别

本文深入探讨了C++中static_cast和reinterpret_cast的区别。static_cast主要用于非多态的类型转换,如从float到int;而reinterpret_cast则进行底层位模式的重新解释,如将字符串指针转换为整型,实现数据的二进制形式转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Qt 中static_cast 和 reinterpret_cast的区别

1. C++中的static_cast执行非多态的转换,用于代替C中通常的转换操作。因此,常做为隐式类型转换使用。比如:

int i; 

float f = 166.7f; 

i = static_cast<int>(f); 

此时结果,i的值为166

2. C++中的reinterpret_cast主要是将数据从一种类型的转换为另一种类型。所谓“通常为操作数的位模式提供较低层的重新解释”也就是说将数据以二进制存在形式的重新解释。比如:

int i;

char *p = "This is a example."; 

i = reinterpret_cast<int>(p); 

此时结果,ip的值是完全相同的。reinterpret_cast的作用是说将指针p的值以二进制(位模式)的方式被解释为整型,并赋给i,一个明显的现象是在转换前后没有数位损失。

void FloorDet::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) { if (_c == QMetaObject::InvokeMetaMethod) { auto *_t = static_cast<FloorDet *>(_o); Q_UNUSED(_t) switch (_id) { case 0: _t->openCam(); break; case 1: _t->destroyCam(); break; case 2: _t->startCam(); break; case 3: _t->startcam(); break; case 4: _t->softCam(); break; case 5: _t->SendLog2((*reinterpret_cast< QString(*)>(_a[1]))); break; case 6: _t->sendtoolsA((*reinterpret_cast< cv::Mat(*)>(_a[1])),(*reinterpret_cast< cv::Mat(*)>(_a[2]))); break; case 7: _t->sendtoolsB((*reinterpret_cast< cv::Mat(*)>(_a[1])),(*reinterpret_cast< cv::Mat(*)>(_a[2]))); break; case 8: _t->chufa(); break; case 9: _t->cfclearD(); break; case 10: _t->pictureA11(); break; case 11: _t->pictureA12(); break; case 12: _t->pictureB1(); break; case 13: _t->pictureB2(); break; case 14: _t->pictureB3(); break; case 15: _t->XSzs_m((*reinterpret_cast< QString(*)>(_a[1]))); break; case 16: _t->XSng_m((*reinterpret_cast< QString(*)>(_a[1]))); break; case 17: _t->XSbb_m((*reinterpret_cast< QString(*)>(_a[1]))); break; case 18: _t->XSyw_m((*reinterpret_cast< QString(*)>(_a[1]))); break; case 19: _t->XShs_m((*reinterpret_cast< QString(*)>(_a[1]))); break; case 20: _t->XSll_m((*reinterpret_cast< QString(*)>(_a[1]))); break; case 21: _t->on_Start_clicked(); break; case 22: _t->on_Stop_clicked(); break; case 23: _t->on_pushButton_clicked(); break; case 24: _t->WriteLog((*reinterpret_cast< QString(*)>(_a[1]))); break; case 25: _t->clearD(); break; case 26: _t->showB1(); break; case 27: _t->showB2(); break; case 28: _t->showB3(); break; case 29: _t->showA11(); break; case 30: _t->showA12(); break; case 31: _t->showA21((*reinterpret_cast< QImage(*)>(_a[1]))); break; case 32: _t->showA22((*reinterpret_cast< QImage(*)>(_a[1]))); break; case 33: _t->showA31((*reinterpret_cast< QImage(*)>(_a[1]))); break; case 34: _t->showA32((*reinterpret_cast< QImage(*)>(_a[1]))); break; case 35: _t->YANSHI(); break; case 36: _t->writelogs((*reinterpret_cast< QString(*)>(_a[1])),(*reinterpret_cast< QString(*)>(_a[2]))); break; case 37: _t->LoadStationA21Img(); break; case 38: _t->LoadStationA22Img((*reinterpret_cast< std::string(*)>(_a[1]))); break; case 39: _t->LoadStationA31Img((*reinterpret_cast< std::string(*)>(_a[1]))); break; case 40: _t->LoadStationA32Img((*reinterpret_cast< std::string(*)>(_a[1]))); break; case 41: _t->resizeWindow(); break; default: ; } } else if (_c == QMetaObject::IndexOfMethod) { int *result = reinterpret_cast<int *>(_a[0]); { using _t = void (FloorDet::*)(); if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&FloorDet::openCam)) { *result = 0; return; } } { using _t = void (FloorDet::*)(); if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&FloorDet::destroyCam)) { *result = 1; return; } } { using _t = void (FloorDet::*)(); if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&FloorDet::startCam)) { *result = 2; return; } } { using _t = void (FloorDet::*)(); if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&FloorDet::startcam)) { *result = 3; return; } } { using _t = void (FloorDet::*)(); if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&FloorDet::softCam)) { *result = 4; return; } } { using _t = void (FloorDet::*)(QString ); if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&FloorDet::SendLog2)) { *result = 5; return; } } { using _t = void (FloorDet::*)(cv::Mat , cv::Mat ); if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&FloorDet::sendtoolsA)) { *result = 6; return; } } { using _t = void (FloorDet::*)(cv::Mat , cv::Mat ); if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&FloorDet::sendtoolsB)) { *result = 7; return; } } { using _t = void (FloorDet::*)(); if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&FloorDet::chufa)) { *result = 8; return; } } { using _t = void (FloorDet::*)(); if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&FloorDet::cfclearD)) { *result = 9; return; } } { using _t = void (FloorDet::*)(); if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&FloorDet::pictureA11)) { *result = 10; return; } } { using _t = void (FloorDet::*)(); if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&FloorDet::pictureA12)) { *result = 11; return; } } { using _t = void (FloorDet::*)(); if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&FloorDet::pictureB1)) { *result = 12; return; } } { using _t = void (FloorDet::*)(); if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&FloorDet::pictureB2)) { *result = 13; return; } } { using _t = void (FloorDet::*)(); if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&FloorDet::pictureB3)) { *result = 14; return; } } { using _t = void (FloorDet::*)(QString ); if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&FloorDet::XSzs_m)) { *result = 15; return; } } { using _t = void (FloorDet::*)(QString ); if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&FloorDet::XSng_m)) { *result = 16; return; } } { using _t = void (FloorDet::*)(QString ); if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&FloorDet::XSbb_m)) { *result = 17; return; } } { using _t = void (FloorDet::*)(QString ); if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&FloorDet::XSyw_m)) { *result = 18; return; } } { using _t = void (FloorDet::*)(QString ); if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&FloorDet::XShs_m)) { *result = 19; return; } } { using _t = void (FloorDet::*)(QString ); if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&FloorDet::XSll_m)) { *result = 20; return; } } } }解释一下这段代码
最新发布
07-30
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值