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属性进行修改,首先要保证这段内存能够被修改

 

相关文章
|
6月前
|
安全 编译器 程序员
【C++】C++的类型转换
【C++】C++的类型转换
|
6月前
|
设计模式 安全 算法
【C/C++ 类型转换 】深入理解C++向上转型:从基础到应用
【C/C++ 类型转换 】深入理解C++向上转型:从基础到应用
214 0
|
1月前
|
编译器 C语言 C++
C++入门4——类与对象3-1(构造函数的类型转换和友元详解)
C++入门4——类与对象3-1(构造函数的类型转换和友元详解)
19 1
|
1月前
|
存储 编译器 数据安全/隐私保护
【C++篇】C++类与对象深度解析(四):初始化列表、类型转换与static成员详解2
【C++篇】C++类与对象深度解析(四):初始化列表、类型转换与static成员详解
30 3
|
1月前
|
编译器 C++
【C++篇】C++类与对象深度解析(四):初始化列表、类型转换与static成员详解1
【C++篇】C++类与对象深度解析(四):初始化列表、类型转换与static成员详解
45 3
|
6月前
|
存储 安全 编译器
C++:现代类型转换
C++:现代类型转换
50 5
|
1月前
|
C++
C++入门4——类与对象3-2(构造函数的类型转换和友元详解)
C++入门4——类与对象3-2(构造函数的类型转换和友元详解)
21 0
|
4月前
|
存储 安全 编译器
【C++11】类型转换
【C++11】类型转换
25 0
|
4月前
|
安全 程序员 编译器
C++一分钟之-C++中的类型转换
【7月更文挑战第8天】C++中的类型转换涉及隐式和显式操作,隐式转换如从`int`到`double`是自动的,但可能导致数据丢失。显式转换包括`static_cast`, `dynamic_cast`, `const_cast`, `reinterpret_cast`,以及转换构造函数。要避免数据丢失、类型不匹配和运行时错误,需谨慎使用显式转换并检查结果。过度使用`reinterpret_cast`应避免。理解这些转换有助于编写更安全的代码。
43 0
|
6月前
|
安全 程序员 C语言
从C语言到C++_37(特殊类设计和C++类型转换)单例模式(下)
从C语言到C++_37(特殊类设计和C++类型转换)单例模式
53 5