首页 > 编程语言 >C++:强制类型转换速通

C++:强制类型转换速通

时间:2024-08-24 18:52:19浏览次数:9  
标签:类型转换 转换 速通 派生类 C++ cast 基类 ptr 指针

强制类型转换

核心为四个cast类型

分别是:

  • static_cast
  • dynamic_cast
  • const_cast
  • reinterpret_cast

补充:转换是否安全

首先,派生类内一定有基类。

基类指针可以指向派生类

如果将指向基类的指针指向派生类,派生类对象在内存中的布局通常会以基类部分的开头,派生类可以看做是对基类的成员和方法补充拓展。因此,基类指针或引用可以直接指向派生类对象,可以看做指向的是派生类中的基类部分

派生类指针不能指向基类

与上面相反,因为派生类存在重写基类后。基类对象没有派生类的扩展部分,或者说派生类指针指向的区域比实际指向的"大",如果强制转换,可能会导致访问无效的内存区域或错误的数据。

转换相关内容后续会有独立文章,敬请期待!

正文

static_cast

用于基本类型之间的转换,以及具有继承关系的指针或引用之间的转换,例如将指向派生类的指针或引用转换为指向基类的指针或引用。静态转换在编译时进行类型检查,不会进行运行时类型检查。

int i = 10;
double d = static_cast<double>(i);

由于静态时类型检测,因而对于不同类转化可能存在风险,不如Dynamic_cast安全,但是效率比较高。

dynamic_cast

主要用于多态类型之间的安全向下转型(派生类到基类的转换)。它在运行时进行类型检查,只能用于包含虚函数的类(多态类型)。

Base *base_ptr = new Derived();
Derived *derived_ptr = dynamic_cast<Derived*>(base_ptr);
if (derived_ptr) {
    // 成功将 base_ptr 转换为 Derived* 类型
} else {
    // 转换失败,base_ptr 指向的对象不是 Derived 类型
}

const_cast

用于删除指针或引用的常量性(const 或 volatile 限定符),允许修改被指向对象的值。const_cast 主要用于修改函数的形参类型,使其可以修改实参的值。

const int ci = 10; 
int *i_ptr = const_cast<int*>(&ci); 
*i_ptr = 20; // 可以修改 ci 的值,尽管 ci 声明为 const

reinterpret_cast

用于不同类型的指针之间的转换,或者将指针转换为整数类型,通常用于底层编程和对位操作的需求。它提供了最低层次的转换能力,编译器只是简单地将一个类型的位模式解释为另一个类型的位模式。

int value = 10;
void *void_ptr = reinterpret_cast<void*>(&value); // 将 int* 转换为 void*
int *new_value_ptr = reinterpret_cast<int*>(void_ptr); // 将 void* 转换回 int*

标签:类型转换,转换,速通,派生类,C++,cast,基类,ptr,指针
From: https://blog.csdn.net/m0_73727069/article/details/141503288

相关文章

  • C++:STL六大组件,知识点总结。
    STL知识点总结STL是C++标准库中的一个重要部分,提供了一组灵活通用的数据结构,核心是模板类。接下来是STL的主要组件及其功能简介。1.容器容器是用来存储和管理一组数据的对象。不同的容器适用于不同类型的数据存储需求。可理解为各种形式实现的存储结构顺序容器vec......
  • Qt/C++音视频开发81-采集本地麦克风/本地摄像头带麦克风/桌面采集和麦克风/本地设备和
    一、前言随着直播的兴起,采集本地摄像头和麦克风进行直播推流,也是一个刚需,最简单的做法是直接用ffmpeg命令行采集并推流,这种方式简单粗暴,但是不能实时预览画面,而且不方便加上一些特殊要求。之前就已经打通了音视频文件和视频流的采集,那是不是可以简单点的方式就能直接加入到原有的......
  • [底层原理] C/C++获取时间(将时间戳转换为年月日)?
    前言大家都知道,计算机中存储的时间是一个整数,在现在的编程语言中,可以很方便地将时间戳(整数)转换为字符串,但是如果没有这些我们该如何自己计算出呢?刚好以前研究过Nginx的源代码,我以他的代码为例,说明其背后的数学原理。当然在工程实践中,没有必要花时间自己实现转换的函数,所以本......
  • 【C++】类与对象篇三
    【C++】类与对象篇三一.运算符重载1运算符重载2赋值运算符重载3前置++和后置++重载4.const成员5.取地址及const取地址操作符重载一.运算符重载1运算符重载C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数函数名字为:关键字o......
  • 解决 C/C++ 程序执行一闪而过的方法
    作者:一去、二三里个人微信号:iwaleon微信公众号:高效程序员在VS编写控制台程序的时候,包括使用其他IDE(VisualC++)编写C/C++程序,经常会看到程序的执行结果一闪而过,要解决这个问题,可以在代码的最后加上system("pause")、getchar()、cin.get()。推荐方法比较常用的做......
  • C++11
    类型推导类型推导是C++的一种特性,允许编译器自动推导变量的类型,而不需要显式地制定类型。autoauto用于让编译器自动推导变量类型,常见用法:基本示例:autox=10;与容器一起使用:vector<string>names={"Alice","Bob"};for(autoit=names.begin();it!=names.en......
  • C++调用Python和numpy第三方库计算MFCC音频特征实现封装发布
    目录项目简介程序/数据集下载环境准备执行步骤1.新建python虚拟环境2.虚拟环境运行下python代码3.迁移虚拟环境4.编写Cmakelists.txt5.编写C++代码6.编译项目7.测试项目简介深度学习程序的边缘部署以性能绝佳的C++为主(⊙﹏⊙),但遇到项目开发周期短,则以功能优先,一些复杂的算法和......
  • 从零开始学习C++之结构体
    前言之前讲过变量,讲了数据类型(如int等),而结构体就相当于创造一个类型。定义结构体首先,写上一个神圣不可侵犯的(bushi)struct。好了,不开玩笑了。在程序外围定义(一般写在命名空间后面)。struct名字{ 含有的东西。};一定一定要有分号!!!例:定义存储坐标的结构体structzuo......
  • 从零开始学习C++之函数
    前言作者看着200行的主函数大模拟返回了WA,陷入了沉思......咋办?把每个模块包装一下就知道哪里出错了,所以,今天讲函数。(太生硬了吧。。。)定义一个函数格式:返回值类型函数名(变量*n){ 代码}例如:intadd(inta,intb){ returna+b;}注:定义函数中的每个变量必......
  • 从零开始学习C++
    updateon2024/8/24前言配置环境基本编码格式入门输入输出循环变量与数组if判断语句(分支结构)基础函数......