7.类型转换(未完)

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,对于引用抛异常。要深入了解内部转换的原理。

posted @ 2019-06-08 14:47  Royzzzzz  阅读(164)  评论(0)    收藏  举报