C++11各种cast的详细介绍-看完就懂

C++11各种cast的详细介绍-看完就懂

前言

这也是我在刷面经的时候看到的,我逐渐摸清楚了大厂面试官的套路:如何衡量一个人对某个知识的了解程度,即问一些犄角旮旯的东西。如果你连这些知识都掌握了,那也就十拿九稳了。

static_cast

就是一种比较差劲的静态类型转换。为啥叫static静态呢?很简单,因为它没有运行时的动态类型检查。这咋理解呢?没事儿,继续看下去。
1.static_cast用在基类与派生类的指针或者是引用的转换上。两个方向的进行对于static_cast而言都是允许的,是不是很惊讶?没错就是这么垃圾。咱们都知道,子类转换成父类其实是可以接受的,前面的设计模式也说到了父子转换的一个规则-里式替换原则。但是父类转换成子类时闹哪样???关键static_cast还不会报错!!!
没办法了,这件事情只能咱们自己把控。
2.基本的数据类型之间的转换。比如char转int,或者空指针转换成其他类型的指针,或者把其他类型的指针转换成空指针。这个显而易见,也是没法提供安全保障的,所以也得咱们程序员自己负责。
另外要多说一句,static_cast不能更改输入参数的const与volatile属性!!!

const_cast

这个就更简单了,就是可以去除掉变量的const或者是volatile属性。(至于为什么要去除掉,也很好理解,一部分原因是兼容旧的c库)
但是咱们这样做肯定是不行的:

const int a = 10;
int b = a;

很明显,const_cast接受的是常量对象的指针或者是引用。

const int a = 10;
int* noConsta = const_cast<int*>(a);

这样一来,const属性就被去掉了(指的是noConsta可以访问这块const变量的地址了)。
那你肯定就好奇了,这样搞的话岂不是乱套了???本来我写了个const变量就是不想被改变,现在你为了兼容旧的c库就要拿我开刀?C++语言开发工程师就这点水平?显然并不是这样的。您可以试试,通过noConsta对其进行赋值,然后您通过两种途径打印出真实的地址数值,您就会发现,大概率是没有变化的。
这种行为是未定义的,究竟该怎么做是编译器决定的,但是咱们肯定支持无法改变这样的结果。这样一来,既兼容了旧的C库,又维护了const的尊严,完美。

dynamic_cast

它就是补充了static_cast不完美的一部分。
dynamic_cast只接受类的指针或者引用输入,且对应的转换后的类型也必须是类对象的指针或者是引用。
它只用在父子类的转换,且是一种动态类型转换。

class B{
public:
int m_iNum;
virtual void foo();
};
class D:public B{
public:
char *m_szName[100];
};
void func(B *pb){
D *pd1 = static_cast<D *>(pb);
D *pd2 = dynamic_cast<D *>(pb);
}

看吧,对于这个输入父类对象pb(当然子类对象也可输入进去呀),如果输入pb真的是父类对象(指内存中存储的是父类对象),那么你想转换成子类,对不起,static_cast可以,但是dynamic_cast只会返回一个nullptr。

reinterpret_cast

接触不多,就不展开讲了,好像是从二进制的角度重新解释这段内存的含义。

猜你喜欢

转载自blog.csdn.net/weixin_44039270/article/details/106943217