首页 > 编程语言 >C++的四种强制类型转换符,看了就懂

C++的四种强制类型转换符,看了就懂

时间:2024-03-25 23:02:41浏览次数:24  
标签:类型转换 派生类 dynamic C++ cast 引用 基类 四种 指针

运行时类型检查转换dynamic_cast

用途及条件

1、基类要有虚函数

2、主要用于“安全地向下转型”

解释

1、为什么基类要有虚函数?

答:dynamic_cast在运行时会进行类型检查,这种检查不是语法上的检查,而是真实情况地检查。如何检查?如果代码中使用了强制类型转换dynamic_cast,编译器会在运行时生成一段代码来查询对象的虚函数表,利用虚函数表和虚函数表指针判断原对象是否可以安全地转换成目标对象。所以基类中要有虚函数,不然调用dynamic_cast会报错。

这段代码,基类没有虚函数,调用dynamic_cast报错 “ 操作数必须包含多态类型 ”

2、什么是安全地向下转型

说白了,就是将 指向派生类的基类指针或基类引用 安全地 转换成派生类指针或派生类引用 ;或者将空基类指针安全地转换成 派生类指针;引用必须初始化,所以没有将空引用转换的说法;

3、向上转型

“先上转型”(即派生类指针或引用类型转换为其基类类型),本身就是安全的,尽管可以使用dynamic_cast进行转换,但这是没必要的, 普通的转换已经可以达到目的

static_cast

用途:

1、用于内置类型的转换(这种转换用c风格的强制转换也是一样的)

2、指针之间的转换

reinterpret_cast

reinterpret_cast<目标类型>(原类型);

<目标类型>和(原类型)中必须有一个是指针或引用类型。

用途:

1、改变指针或引用的类型

2、将指针或引用转换成整型

3、将整型转换成指针或引用

const_cast

前面四种类型转换不能去掉变量的const和volatile特性

这里的变量是指指针或引用(其实引用就是指针,理解指针的就行了)

为什么说这里的变量是指指针,而不能是内置变量? 因为对于内置变量来说,就只是简单的赋值,和const无关

去掉指针的const

标签:类型转换,派生类,dynamic,C++,cast,引用,基类,四种,指针
From: https://blog.csdn.net/m0_63049243/article/details/137028710

相关文章

  • C++缺省参数与函数重载
    1.缺省参数1.1定义即函数声明或定义时为函数指定一个缺省值,如果调用函数时传入参数,则变量的值为实参的值,如果调用时未传入参数,则变量的值为缺省值。//其中a=0即为定义的缺省值voidFun_test(inta=0){ cout<<"a="<<a<<endl;}intmain(){//传入参数,a......
  • 用Dev C++实现NOKIA经典游戏贪吃蛇
    前期准备头文件:#include<bits/stdc++.h>#include<stdio.h>#include<conio.h>#include<windows.h>控制界面配置:voidcolor(intx){ SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),x);}//设置不同颜色voidHide(){ HANDLEhOut; CONSOLE_CUR......
  • 学会在 C++ 中使用变量:从定义到实践
    C++变量变量是用于存储数据值的容器。在C++中,有不同类型的变量(使用不同的关键字定义),例如:int-存储整数(没有小数点),例如123或-123double-存储浮点数,带有小数点,例如19.99或-19.99char-存储单个字符,例如'a'或'B'。字符值用单引号括起来string-存储文本,例如......
  • C++调用C# (使用C++/CLI)
    简介C++/CLI简介见上文 C#调用C++(使用C++/CLI)-咸鱼翻身?-博客园(cnblogs.com)新建解决方案->CPlusCSharpSolution新建C#类库->CSharpNative新建类NativeCalculate1publicclassNativeCalculate2{3publicintAdd(inta,intb)4{......
  • C#调用C++ (使用C++/CLI)
    简介C++/CLI(C++CommonLanguageInfrastructure)是一种允许在.NET平台上创建托管代码(managedcode)和非托管代码(unmanagedcode)之间互操作的语言。其原理可以概括如下:编译器支持:C++/CLI编译器能够编译同时包含托管和非托管代码的源文件。这使得在同一个项目中可以混合使用......
  • 蓝桥杯n皇后问题C++
    用到了dfs算法#include<iostream>usingnamespacestd;intn;inta[10][10]={0};intsum=0;voidprin(inta[][10]){for(inti=0;i<n;i++){for(intj=0;j<n;j++){cout<<a[i][j]<......
  • C++动态内存管理
    目录C/C++内存分配C++内存管理C++内存管理介绍C++内存管理使用C++内存管理基本语法operatornew和operatordelete函数定位new表达式(placement-new)基本语法使用场景malloc/free和new/delete相同点不同点C/C++内存分配在C语言动态内存管理章节已经了解到内......
  • day03 java自动类型转换 和 强制类型转换
    自动类型转换定义将取值范围小的类型自动提升为取值范围大的类型。注意比较的不是所占内存大小,而是数据类型取值范围的大小,如int整数类型和float浮点类型所占内存数大小相同但是浮点数采用ieee754标准计数法表示范围更大,所以int可以变为float并且不损失精度。当把存储......
  • C++中用户自定义数据类型
    在C++中,用户自定义数据类型通常指的是通过struct、class、enum和typedef关键字定义的类型。这些自定义类型可以包含各种成员,包括基本数据类型、其他自定义类型、成员函数(对于class)、访问修饰符等。下面是这些自定义数据类型可以包含的组件的概述:结构体(struct)结构体是一种......
  • C++学习
    学习主线算法基础:https://www.acwing.com/activity/content/11/理解算法原理,完成模板题,熟练使用模版课外练习:针对特定主题,可以进行拓展练习爱思创题库:https://aisichuang.net/main/questionBank/questionBankhttps://leetcode.cn/leetbook/https://ac.nowcoder.co......