C++的类型转换

简介: C++的类型转换

类型转换名称和语法

       C风格的强制类型转换(Type case)很简单,无论什么类型的转换统统  TYPE b = (TYPE)a

       C++风格的类型转换提供了4中方法:

static_cast            静态类型转换
reinterpreter_cast     重新解释类型(不安全,不推荐使用)
dynamic_cast           动态类型转换
const_cast             去const属性

四种类型转换的详情

static_cast

静态类型转换,编译的时候 c++编译器会做类型检查。 基本类型能够转换,但是不能转换指针。可实现C++中内置基本数据类型之间的相互转换(int,struct,enum,char...)。不能进行无关类型指针之间的转换。【无关类型:非基类与派生类之间,也就是说可以进行基类与子类之间的类型转换,但是不建议使用,不安全。编译阶段进行的,它可以是基类转成子类,显然这样是不行的】

reinterpret_cast

与C风格相同,不考虑类型安全,不到万不得已不建议使用

重写解释类型,但没有进行二进制转换。转换类型必须是一个指针,应用、算数类型、函数指针、成员指针。在比特级别上进行转换。最普通的用途就是在函数指针类型之间进行转换,很难保证移植性。

dynamic_cast

动态类型转换,安全的基类和子类之间转换,运行时类型检查。使用时保证基类中有虚函数,否则编译不通过。类中存在虚函数,就说明它想让基类的指针或引用指向派生类。

const_cast

去除变量的只读属性。不能在不同种类间转换。仅仅作用于const,可以使本来不是const转成const,本来是const去除const。

向上转型:dynamic_cast与static_cast效果一样
向下转型:dynamic_cast比static_cast更加安全
(父类指针可以指向子类对象,因为类型兼容机制   子类指针不能指向父类对象)

程序案例

       C语言中,能隐式类型转换的在C++中可以用static_cast进行类型转换

       C语言中,不能隐式类型转换的在C++中可以用reinterpret_cast进行类型转换

要转型就必须先有继承。继承是面向对象语言中一个代码复用机制。简单说就是子类继承了父类中的非私有属性和可以继承的方法。然后子类可以继承扩展自己的属性和方法。

向上转型:通过子类对象实例化父类对象,这种是自动转换(Father f = new Son)

向下转型:通过父类对象实例化子类对象,这种需要强制转换(Son s = (Son)f)

#include <iostream>
using namespace std;
class Animal
{
public:
    virtual void cry() = 0;
};
class Dog:public Animal
{
public:
    virtual void cry()
    {
        cout<<"wangwnag"<<endl;
    }
    void doSwim()
    {
        cout<<"狗爬"<<endl;
    }
};
class Cat:public Animal
{
public:
    virtual void cry()
    {
        cout<<"miaomiao"<<endl;
    }
    void doTree()
    {
        cout<<"我要爬树"<<endl;
    }
};
class Book
{
public:
    void printP()
    {
        cout<<price<<endl;
    }
private:
    int price;
};
void ObjPlay(Animal *base)
{
    base->cry();
    //Dog *pDog = static_cast<Dog *>(base);  //向下转型
    Dog *pDog = dynamic_cast<Dog *>(base);
    if(pDog != nullptr)
    {   
        pDog->cry();
        pDog->doSwim();
    }
    Cat *pCat = dynamic_cast<Cat *>(base);  //向下转型
    if(pCat != nullptr)
    {
        pCat->cry();
        pCat->doTree();
    }
}
int main(void)
{
    Animal  *base = NULL;
    Cat *pCat;
    Dog *pDog = dynamic_cast<Dog *>(base);       //向下转型:
    base = dynamic_cast<Animal *>(pCat);         //向上转型
    base = pCat;        //向上转型 
    //pCat = base;        //err  向下转型需要强制转换
    //把base转换成其他 非动物相关的 err
    //Book *pbook = static_cast<Book *>(base);
    Book *pbook = reinterpret_cast<Book *>(base);
    //dynamic_cast用法
    ObjPlay(new Cat());     //这个传参的过程是一个向上转型
    return 0;
}

cosnt_cast实例

       如果需要去const属性进行修改,首先要保证这段内存能够被修改

 

相关文章
|
1月前
|
设计模式 安全 算法
【C/C++ 类型转换 】深入理解C++向上转型:从基础到应用
【C/C++ 类型转换 】深入理解C++向上转型:从基础到应用
42 0
|
1月前
|
安全 编译器 程序员
特殊类设计以及C++中的类型转换
特殊类设计以及C++中的类型转换
28 2
|
1月前
|
安全 编译器 C++
【C/C++ 类型转换规则】一文了解C/C++ 中的类型转换规则,帮助你更好的编程
【C/C++ 类型转换规则】一文了解C/C++ 中的类型转换规则,帮助你更好的编程
19 0
|
4天前
|
安全 编译器 C语言
【C++高阶(九)】C++类型转换以及IO流
【C++高阶(九)】C++类型转换以及IO流
|
1月前
|
算法 Linux 编译器
【C++ 泛型编程 进阶篇】 C++ 模版元编程 类型转换 std::decay 全面教程
【C++ 泛型编程 进阶篇】 C++ 模版元编程 类型转换 std::decay 全面教程
43 0
|
1月前
|
安全 编译器 C语言
【C++ 类型转换关键字 *_cast 】理解const_cast、reinterpret_cast、dynamic_cast和static_cast的用法
【C++ 类型转换关键字 *_cast 】理解const_cast、reinterpret_cast、dynamic_cast和static_cast的用法
28 0
|
安全 编译器 程序员
【C++】—— C++的类型转换
【C++】—— C++的类型转换
|
1月前
|
安全 编译器 程序员
C++类型转换
C++类型转换
10 0
|
1月前
|
C++
c++类型转换
c++类型转换
61 1
|
2月前
|
存储 C++
C++ 操作重载与类型转换(二)
C++ 操作重载与类型转换(二)
42 2