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

举报
yd_274589494 发表于 2023/08/26 19:40:17 2023/08/26
【摘要】 @TOC 前言本篇文章我们来讲解C++中的新式类型转换,在C语言中遇到类型转换我们一般使用强制类型转换,但是这种转换的方式是不安全的,可能会导致截断的发生,C++引入的新式类型转换解决了这个问题。C++中的新式类型转换是一种更加安全和灵活的类型转换方法,它提供了四种不同的转换操作符,分别是static_cast、dynamic_cast、reinterpret_cast和const_cast...

@TOC


前言

本篇文章我们来讲解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

总结

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

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。