首页 > 其他 > 详细

7.类型转换(未完)

时间:2019-06-08 16:16:14      阅读:131      评论:0      收藏:0      [点我收藏+]

7.1.为什么不适用C的强制类型转换?

C的强制转换表面上看起来功能强大什么都能转,但是转化不够明确,不能进行错误检查,容易出错。

7.2.static_cast

static_cast用的最多,对于各种隐式转换,非const转const,void*转指针等, static_cast能用于多态想上转化,如果向下转能成功但是不安全,结果未知。

 1 #include "pch.h"
 2 #include <iostream>
 3 using namespace std;
 4 int main()
 5 {   
 6     //普通的double转为int型,编译器将不再提醒精度丢失
 7     int value = 5;
 8     int value_1 = static_cast<int>(value);
 9     cout << value_1 << endl;
10     //将void*转换回初始的指针类型
11     void * p = &value;
12     //必须确保指针转换后所得的类型就是指针所指的类型,这里类型与原类型不符,所得结果未知,有些编译器可以编译通过,但结果未知
13     //警告:结果未知,*q不可能是5.0
14     double *q = static_cast<double *>(p);
15     cout << *q << endl;
16     //可以将非const转换为const
17     int p_1 = 5;
18     const int p_2 = static_cast<const int>(p_1);
19     cout << p_2 << endl;
20     //错误,不允许转换带有底层const的类型
21     const int *  p_3 = &p_1;
22    // int * p_4 = static_cast<int *>(p_3);
23     //可以去掉顶层const属性
24     int * const p_5 = &p_1;
25     int * p_6 = static_cast<int *>(p_5);
26     //这是一个特别有意思的转换
27     //static_cast<string>(m)的含义是以m为参数构造一个string类型的返回值,这个转型的过程必需是在编译期可以确定的。
28     //在string类内部有这样一个构造函数string (const char* s)
29     const char *m;      // 底层const  
30     string t = static_cast<string>(m);
31 
32     return 0;
33 
34 }

7.3.const_cast

const_cast用于将const变量转为非const

1     //const_static 只能改变运算对象的底层const
2     const char* pc="qq";
3     //正确,但是通过q_1写值是未定义的行为
4     char *q_1 = const_cast<char *>(pc);   
5     //错误,const_cast只能改变常量属性,不能改变类型
6     const_cast<string>(pc);

7.4.reinterpret_cast

reinterpret_cast几乎什么都可以转,比如将int转指针,可能会出问题,尽量少用;

7.5.dynamic_cast

dynamic_cast用于动态类型转换。只能用于含有虚函数的类,用于类层次间的向上和向下转化。只能转指针或引用。向下转化时,如果是非法的对于指针返回NULL,对于引用抛异常。要深入了解内部转换的原理。

7.类型转换(未完)

原文:https://www.cnblogs.com/Royzzzzz/p/10990680.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!