【C++】类型转换(学习笔记)

1、 隐式类型转换,相关联的类型(e.g.int vs double)之间可以发生隐式类型转换。

  比如,在条件中,非布尔类型转为布尔类型;

    初始化时,初始值变为变量类型;

    赋值时,右值变成左侧的类型;

    运算过程中的类型统一;

    数组被转换成指向首元素的指针;

2、 显式类型转换

  Cast-name<type> expression;

int i,j;
double s = statc_cast<double>(j)/i;

1) static_cast 具有明确定义的类型转换,不能包含底层const;

在把较大数据类型赋值给较小数据类型时非常有有用。(为什么呢?强制类型转换会丢失精度,由大变小不会超出范围,但是由小变大不一定)

2) cosnt_cast 只能改变运算对象的底层const,只改变表达式const属性而不改变类型。一般是去掉const性质,使之可以改变对象的值(如果对象本身不是const的话,否则会报错)  

const char *pc;
char *p = const_cat<char*>(pc);   //p是一个非常量指针,与pc指向相同区域
                    //注意type与原类型一样,没有改变,只改变了const

3) reinterpret_cast 为运算对象的位模式提供较低层次上的重新解释。(非常危险)

4) dynamic_cast 支持运行时类型识别

什么时候需要dynamic_cast呢?

  举个例子:基类的指针或者引用想要调用派生类的函数时,这个函数却不是虚函数,可以通过dynamic_cast进行强制将基类指针或者引用转换成派生类的指针或引用。

  Dynamic_cast<type*>e;

  Type必须是类类型,而且一般应该含有虚函数(不懂为啥)。

  e必须符合三个条件中的一个①e是type的公有派生类②e是type的公有基类③e的类型就是type

  如果转换失败,指针转换类型失败会返回0,引用类型失败抛出bad_cast异常

原文地址:https://www.cnblogs.com/Chilly2015/p/5691680.html