C++类型转换 |
您所在的位置:网站首页 › c语言强制转换类型顺序 › C++类型转换 |
文章目录
c语言中的类型转换为什么C++需要四种类型转换.C++强制类型转换static_castreinterpret_castconst_castdynamic_cast
c语言中的类型转换
在C语言中,如果赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与接收返回值类型不一致时,就需要发生类型转化,C语言中总共有两种形式的类型转换:隐式类型转换和显式类型转换。 隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译失败. 显式类型转化:需要用户自己处理. int main() { //隐式类型转换 double d = 1.1; int i = d; cout //_tr[end + 1] = _str[end]; --end; } }C风格的转换格式很简单,但是有不少缺点的: 隐式类型转化有些情况下可能会出问题:比如数据精度丢失显式类型转换将所有情况混合在一起,代码不够清晰. C++强制类型转换 static_caststatic_cast用于非多态类型的转换(静态转换),编译器隐式执行的任何类型转换都可用static_cast,但它不能用于两个不相关的类型进行转换 int main() { double d = 12.34; int a = static_cast(d); cout const int a = 2; int* p = const_cast(&a); *p = 3; cout }; int _a = 1; }; class B : public A { public: int _b = 3; }; void Func( A* pa ) { B* pb = dynamic_cast (pa); pa->_a++; pb->_b++; } int main() { A aa; B bb; Func(&aa); Func(&bb); }为了访问更加安全,C++便提出了向下转型: 如果pa指向子类,那么便可以强制转换,将父类指针转换为子类指针,并返回正确的地址.如果pa指向父类,那么便不可以强制类型转换,转换表达式返回为nullptr.所以,在C++中,面对上述问题,我们可以采用dynamic_cast来强制类型转换,再通过返回值来进行判断访问范围,防止发生越界访问. 如果pa指向子类,便可以通过pb访问子类所有成员.如果pa指向父类,只能pb为空,无法强制转换,pa只能访问父类成员. class A { public: virtual void f() {}; int _a = 1; }; class B : public A { public: int _b = 3; }; void Func( A* pa ) { B* pb = dynamic_cast(pa); if (pb) //pb指向子类. { cout A aa; B bb; Func(&aa); Func(&bb); }延申问题 对于菱形继承来说,切片会产生偏移量,原本父类指针ptr1,ptr2应该都指子类bb,但是经过切片后,ptr1指向子类中的A1,ptr2指向子类中的A2.
|
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |