C++类型转换

您所在的位置:网站首页 c语言强制转换类型顺序 C++类型转换

C++类型转换

2023-07-09 23:33| 来源: 网络整理| 查看: 265

文章目录 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_cast

static_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.

在这里插入图片描述 无论采用c语言的强制转换,还是C++中的dynamic_cast强制转换.

如果将子类指针转换为父类指针,该指针指向子类.那么会发生指针偏移,ptr1指* 向基类A1,解引用访问基类A1,ptr2指向基类A2,解引用访问基类A2.如果将父类指针转换为子类指针,该指针指向子类,ptr1和ptr2依旧指向子类. class A1 { public: virtual void f() {}; int _a1 = 1; }; class A2 { public: virtual void f() {}; int _a2= 1; }; class B : public A1,public A2 { public: int _b = 3; }; int main() { B bb; A1* ptr1 = &bb; A2* ptr2 = &bb; cout


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3