C++零基础教程(新式类型转换)

文章目录

  • 前言
  • 一、static_cast
  • 二、dynamic_cast
  • 三、reinterpret_cast
  • 四、const_cast
  • 总结


前言

本篇文章我们来讲解C++中的新式类型转换,在C语言中遇到类型转换我们一般使用强制类型转换,但是这种转换的方式是不安全的,可能会导致截断的发生,C++引入的新式类型转换解决了这个问题。

C++中的新式类型转换是一种更加安全和灵活的类型转换方法,它提供了四种不同的转换操作符,分别是static_cast、dynamic_cast、reinterpret_cast和const_cast。每种转换操作符都有其特定的用途和限制。

一、static_cast

static_cast用于基本类型之间的转换,以及非多态类型的转换,如指针或引用的类型转换。它具有以下特点:

用于常见的转换操作,如数值类型之间的转换、隐式转换和父子类之间的指针或引用转换。

// 数值类型之间的转换
int num = 10;
double convertedNum = static_cast<double>(num);

// 父子类之间的指针转换
class Base {
public:
    virtual ~Base() {}
};

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

Base* basePtr = new Derived();
Derived* derivedPtr = static_cast<Derived*>(basePtr);
derivedPtr->foo();

二、dynamic_cast

dynamic_cast主要用于多态类型之间的转换,即在类继承关系中进行转换。它具有以下特点:

用于在继承关系中的指针或引用之间进行转换,并进行运行时类型检查。如果转换合法,返回目标类型的指针或引用;如果转换不合法,返回nullptr或引发std::bad_cast异常。
只能用于具有虚函数的类的转换,即运行时类型识别(RTTI)可用的类。
对于指针类型,如果指针为nullptr,转换结果也为nullptr。
转换操作开销较大,涉及动态类型信息查询和检查。

// 多态类型之间的转换
class Base {
public:
    virtual ~Base() {}
    virtual void foo() {
        cout << "Base::foo()" << endl;
    }
};

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

Base* basePtr = new Derived();
Derived* derivedPtr = dynamic_cast<Derived*>(basePtr);
if (derivedPtr != nullptr) {
    derivedPtr->foo();
} else {
    cout << "Dynamic Cast failed." << endl;
}

三、reinterpret_cast

reinterpret_cast用于进行低层次的类型转换,它几乎可以将任何指针或整数类型转换为任意其他类型。它具有以下特点:

用于执行与指针无关的类型之间的转换,如指针和整数之间的转换,以及指针类型之间的转换。
不进行类型检查,提供了最大的灵活性,但也潜在地破坏了类型系统和安全性。
在正常情况下,应避免使用reinterpret_cast,因为它可能导致未定义的行为。

// 指针和整数类型之间的转换
int num = 10;
int* numPtr = &num;
uintptr_t address = reinterpret_cast<uintptr_t>(numPtr);
cout << "Address: " << address << endl;

int* restoredPtr = reinterpret_cast<int*>(address);
cout << "Restored Value: " << *restoredPtr << endl;

四、const_cast

const_cast用于添加或删除指针或引用的const属性。它具有以下特点:

主要用于处理const和非const之间的转换,以提供对常量对象的非常量访问或对非常量对象的常量访问。
不能用于转换掉对象的const属性,这样的转换是未定义行为。
改变了类型修饰符,但不能执行实际的对象或值的转换。

// 添加或删除const属性
const int num = 10;
int& numRef = const_cast<int&>(num); // 移除const属性
numRef = 20;

const int* constPtr = &num;
int* mutablePtr = const_cast<int*>(constPtr); // 移除const属性
*mutablePtr = 30;

cout << "Modified num: " << num << endl; // 输出为20

总结

本篇文章就讲解到这里,新式类型转换大家必须掌握好。

你可能感兴趣的:(C++零基础教程,c++,java,jvm)