C++ 类型转换相关

目录

前言

C语言中的类型转化

类型转换

static_cast (exp)

const_cast (exp)

dynamic_cast (exp)

reinterpret_cast (exp)

总结


前言

这一部分, 我们主要说说C++中的类型转换相关, 注重是关于这个问题, 回答这个问题. 类似于面试题一样~~

C语言中的类型转化

强制类型转换: T(exp)

函数类型转换: T(exp), 传入exp, 返回一个 T 类型的变量, 以完成转换.

出现错误之后, 很难找到出现错误的位置.

类型转换

static_cast(exp)

T 是我们想要转化成的类型, exp是我们的变量或者表达式, static_cast 往往用在类层次之间的转换, 通常是在父类和子类之间发生的, 因此这里就有向下转或者向上转, 上行转换: 从子类指针转化成基类指针, 他是安全的, 因为作为父类指针, 只能访问到子类对象继承到的那一部分, 下行转化: 从父类指针转化成子类指针, 是不安全的, 没有动态类型的检查, 比如下面:

C++ 类型转换相关_第1张图片

用在基本类型之间的转换: 就是C语言中的char转int, int转float这样的, 就不细说了

用在空指针转化成目标类型的空指针

用在非常量类型(non-const) 转化成 常量类型(const)

他的局限性是: 不能去掉 const, volitale 这样类似的属性, 就是转换之前是const限定的, 转化之后也是const限定的. 

const_cast(exp)

T 和 exp 同上, 用在去掉对象指针或者对象引用的 const 属性, 目的是修改 指针或者引用 的访问权限, 之后再通过指针或者引用去修改某块内存的值. 结合static_cast使用, 就可以解决static_cast的局限问题.

dynamic_cast(exp)

T 和 exp 同上, 在static_cast中呢, 在继承体系中, 下行转换是不安全的, dynamic_cast就解决这个问题, 如果向下转化出现问题, 抛出一个bad_cast的异常出来,(将转换失败的指针置为nullptr, 引用呢是没有空引用的). 

他是唯一一个在运行时, 进行类型转化的, 只有在一个类层次结构中, 才能进行安全的转换, 基类的指针或者引用转化为派生类的指针或者引用

reinterpret_cast(exp)

T 和 exp 同上, 用于改变 指针或者引用 的类型, 还可以将指针或者引用转化成整数, 反之亦然, 所以这个地方的 T 呢, 就必须是指针, 引用, 整数, 成员指针(this), 函数指针 其中的一种, 这个仅仅比对bit位的拷贝, 是不做安全的检测的

总结

static_cast, const_cast, reinterpret_cast, 是编译器层面的, 所以是没有安全的检测的, dynamic_cast是运行时的, 所以会有安全监测, 既然有安全监测, 那么必然是要付出一些代价的(性能).

如果说想要去掉指针或者引用的const属性, 就是用const_cast, 想要完成基本类型转化就使用 static_cast,

类层次之间转化呢~, 可以使用static_cast, 也可以使用 dynamic_cast. 

如果是两个函数指针(函数的返回值和参数列表是一致的, 只是函数的名字不一样), 想要将函数名进行转换, 可以使用reinterpret_cast, 不同类型的指针之间转换, 也可以使用 reinterpret_cast.

你可能感兴趣的:(C++,面试题,c++,开发语言)