注意:与通用转换机制相比,这四种转换提供了更安全,更明确的类型转换
dynamic_cast#includeconst_castusing namespace std; class CPerson { public: virtual void Show() { cout << "CPerson" << endl; } }; class CStudent : public CPerson { public: virtual void Show() { cout << "CStudent" << endl; } }; int main() { //! 将CStudent对象地址赋值给CPerson*:成功,返回CPerson*;失败,返回0(即空指针) CPerson *pPer = nullptr; if (pPer = dynamic_cast (new CStudent)) //< 转换成功再调用虚函数 { pPer->Show(); } return 0; }
int n = 10; const int *p = &n; // *p = 29; 错误,无法指针指向的值 int *p2 = const_caststatic_cast(p); *p2 = 29; //< 正确,可以删除const
class CPerson{}; class CStudent: public CPerson{}; //< 继承CPerson class CPond{}; //< 和Cperson,CStudent无关 int main() { CPerson per; CStudent stu; CPerson *pPer = static_castreinterpret_cast(&stu); //< 合法 CStudent* pStu = static_cast (&per); //< 合法 // CPond *pPon = static_cast (&stu); //< 非法,CPond与CStudent不相关 return 0; }
通常,这样的转换适用于依赖于实现的底层编程技术,是不可移植的。例如,不同系统在存储多字节整形时,可能以不同的顺序存储其中的字节。并不支持所有的类型转换,例如,可以将指针类型转换为足以存储指针表示的整形,但不能将指针转换为更小的整数或者浮点型;另一个限制是,不能将函数指针转换为数据指针,反之亦然。
StuPer stuP = {10, 20}; cout << *(short*)((char*)(&stuP)+2) << endl; //< C语言的指针类型转换语法取short b值,输出为20 cout << *(reinterpret_cast参考书籍( (reinterpret_cast (&stuP)+2))); //< c++ 指针类型转换语法,输出为20
C++ Primer Plus(第6版)——15.5 类型转换运算符
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)