了解c++中的类型转换

来源:互联网 发布:java实战项目百度云 编辑:程序博客网 时间:2024/06/05 18:56

1、static_cast(隐式类型转换)—–>相关类型的转换

static_cast用于非多态类型的转换(静态转换),任何标准转换都可以用它,但
它不能用于两个不相关的类型进行转换。

2、reinterpret_cast(强制类型转换)

reinterpret_cast操作符用于将一种类型转换为另一种不同的类型。

3.const_cast(去const属性的类型转换)

const_cast最常用的用途就是删除变量的const属性,方便赋值。

4、dynamic_cast(动态类型转换)——->适用于多态

dynamic_cast用于将一个父类对象的指针转换为子类对象的指针或引用(动态转换)
向上转型:子类对象指针->父类指针/引用(不需要转换)
向下转型:父类对象指针->子类指针/引用(用dynamic_cast转型是安全的)

重点:转换需要满足以下条件:
1. dynamic_cast只能用于含有虚函数的类
2. dynamic_cast会先检查是否能转换成功,能成功则转换,不能则返回0
示例:

#define _CRT_SECURE_NO_WARNINGS 1#include<iostream>using namespace std;struct A{    A(int a)    :_a(a)    {}    virtual void fun()    {}    int _a;};struct B :public A{    B(int a, int b)    :_b(b)    , A(a)    {}    int _b;};void Fun(A* pa){    //如何判断pa绑定的对象是父类对象还是子类对象    B* pb1 = dynamic_cast<B*> (pa);//动态转换    B* pb2 = reinterpret_cast<B*> (pa);//强制类型转换    cout << pb1 << endl;    cout << pb2 << endl;}void Test(){    A a1(1);//构造函数    //应该为:先调构造函数使用4构造一个A类的对象,再使用这个临时对象拷贝构造一个A类的对象a2.    //可以使用下面方式来构造一个A类类型的对象的条件是:    //①构造函数必须是单参的;    //②构造函数不能使用explict修饰,explict关键字防止隐式类型转换    A a2 = 4;    //(隐式类型转换)编译器对这个表达式做了优化,即就是只调了A类的构造函数。    B bb(2,3);    Fun(&a1);//绑定父类对象    Fun(&bb);//绑定子类对象}int main(){    Test();    return 0;}

结果如下:

这里写图片描述

从上述结果可得:
当将绑定父类对象的指针转换(强转或者动态转换)为子类的指针时,动态转换的子类指针结果为空(0)。
而将绑定子类对象的指针转换(强转或动态转换)为子类的指针时,动态转换的子类指针和强制类型转换的结果相等且不为0。

1 0
原创粉丝点击