【C++】C++的四种类型转换

发布于:2024-04-24 ⋅ 阅读:(22) ⋅ 点赞:(0)

一、C语言中的类型转换

在C语言中有两种类型转换,隐式类型转换和显示类型转换。

如果赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与接收返回值类型不一致时,就需要发生类型转化。

隐式类型转换:是编译器在编译期间自动转换,不能转就报错。

显式类型转换:用户自己转换。

int x = 1;
//隐式类型转换
double y = x;
cout << y << endl;

int* p = &x;
//用户自己显示类型转换
int addr = (int)p;
cout << addr << endl;

二.C++需要四种强制类型转换的理由

在C语言中有很多类型转换的可视性不是很好或者存在精度问题,如以下可视性例子:

三.C++中四种强制类型转换

标准C++为了加强类型转换的可视性,引入了四种命名的强制类型转换操作符。

1.static_cast

static_cast多用于静态转换,简单说就是用于两个相关类型

int x = 1;
double y = static_cast<double>(x);
cout << y << endl;

2.reinterpret_cast

reinterpret_cast用于处理不同类型之间的转换。可以将一个指针或引用转换为另一种类型,且不需要进行任何类型检查或安全检查。

int* p = &x;
int addr = reinterpret_cast<int>(p);
cout << addr << endl;

3.const_cast

const_cast用于去除变量的const属性。

	volatile const int i = 0;
	int* p = const_cast<int*>(&i);
	*p = 19;
	cout << i << endl;
	cout << *p << endl;

4.dynamic_cast

dynamic_cast用于将一个父类对象的指针/引用转换为子类对象的指针或引用(动态转换)

向上转型:子类对象指针/引用->父类指针/引用(不需要转换,赋值兼容规则)

向下转型:父类对象指针/引用->子类指针/引用(用dynamic_cast转型是安全的)

注意:

1. dynamic_cast只能用于父类含有虚函数的类

2. dynamic_cast会先检查是否能转换成功,能成功则转换,不能则返回nullptr或者抛异常

#include <iostream>

class Base {
public:
    virtual void show() {
        std::cout << "Base class" << std::endl;
    }
};

class Derived : public Base {
public:
    void show() {
        std:: cout << "Derived class" << std::endl;
    }
};

int main() {
    Base* basePtr = new Derived;
    
    Derived* derivedPtr = dynamic_cast<Derived*>(basePtr);
    
    if(derivedPtr) {
        derivedPtr->show(); // 输出:Derived class
    } else {
        std::cout << "Failed to cast to Derived class" << std::endl;
    }

    delete basePtr;

    return 0;
}