首页 > 编程语言 >C++的四种强制类型转换

C++的四种强制类型转换

时间:2023-07-20 23:55:34浏览次数:28  
标签:类型转换 转换成 转换 C++ cast const 四种 指针

将类型名作为强制转换的语法是C语言保留下来的,C++有自己独有的类型转换,就是四种cast。
它们都有着统一的语法,即xx_cast<typename>(expression),可以将expression转换成typename的类型。

static_cast

顾名思义,静态转换,通常用于内置类型的转换。但是不能用于不同类型的指针/引用之间的转换(唯一的例外是可以将void*指转换成其他类型的指针),也不能将整型转换为指针型。
如果想对类进行转换,需要类之间具有继承的关系。比如说A,B,C类,B类继承自A类。那么B类和A类之间是可以互相转换的,而C类就不能转换成A类,反之亦然。
如果对应的类重载了强制类型转换运算符T,那么可以用static_cast将其转换成T类型。

const_cast

const_cast的功能比较简单,可以去除const属性。
比如将const指针转换成普通指针,将const引用转换成普通引用等。

const string s = "abc";
string &p = const_cast<string&>(s);
string *ps = const_cast<string*>(&s);

reinterpret_cast

这是一个类似C的转换,它可以将任何内置类型转换成其他任何数据类型,也可以将任何指针类型转换成其他类型。
顾名思义,它其实只是让对该对象解释的方式改变了,实际上并没有改变该对象的任何比特。
这种转换的功能最强大,同时也最危险。

dynamic_cast

上面三个转换都是在编译期发生的,dynamic_cast是唯一一个在运行期发生的强制类型转换。
这个转换专门用于将多态父类指针转换成子类指针,在转换过程中,会检查这种转换是否合法,如果不合法就会返回一个nullptr。(注意,这里的将父类指针转换成子类指针,前提是父类指针实际上指向的对象是子类,那么才合法)

但是对于非多态父类指针转换成子类指针,dynamic_cast是做不到的。这是因为这种转换无法保证安全。
对于多态类来说,它内部具有虚函数表,可以通过RTTI(运行时类型信息)来确定指针或者引用所指对象的具体类型。而非多态类无法进行这种动态的类型识别,所以无法检查这种转换的安全性。

标签:类型转换,转换成,转换,C++,cast,const,四种,指针
From: https://www.cnblogs.com/st0rmKR/p/17570041.html

相关文章

  • C++ 不用现成的类库 实现两个非负整数的字符串的和
    给定两个非负整数的字符串num1 和num2 ,返回num1与num2的和Note: num1 和num2 长度都小于5100. num1 和num2 只包含0-9的数字.num1 和num2 开头不为0.不能用现成的类库直接将输入的字符串转换成整数思路:从低位开始遍历相加,和≥10标记add_val=1,<10标记add_val=......
  • C++数值计算——矩阵类的实现(一)
    本系列博客将利用C++实现一系列数值算法。数值算法离不开矩阵,但是C++并未自带矩阵这一对象,直接使用数组又会带来诸多不便,因此我们需要做一些预备工作————编写一个矩阵类,实现矩阵的基本功能。一般来说,读者可以直接使用Eigen库进行矩阵计算,从头开始造轮子仅仅是为了满足笔者个人......
  • 7.20 c++
    //高精度加法#include<bits/stdc++.h>usingnamespacestd;intmain(){chara1[5005],b1[5005];inta[5005],b[5005],c[5005];intla,lb,lc=1,x=0,i;memset(a,0,sizeof(a));memset(b,0,sizeof(b));memset(c,0,sizeof(c));c......
  • c++ day 13
    今天来认识c++里面的迭代器C++迭代器(Iterator)是一种用于遍历容器(如数组、向量、链表等)中元素的抽象概念。它允许你通过简单的接口在容器中移动,并访问容器中的元素,而无需了解底层数据结构的细节。迭代器提供了一种统一的方式来访问不同类型容器的元素,使得代码更加灵活和可复用。......
  • C++Const变量的存储位置
    const变量/对象的存储位置const局部变量const局部基础变量和自定义变量都存储在栈上structdiy_class{inta;intb;diy_class(inta,intb):a(a),b(b){}};intmain(){intb=1;//这个肯定在栈上constinta=10;//比较ab两个变......
  • C++架构师 课程目录
    C++架构师课程目录实现指南规划流程在实现"C++架构师课程目录"之前,我们需要先规划整个流程。以下是实现该功能的步骤:步骤描述1.创建课程目录类创建一个C++类来表示课程目录,并定义相关的成员变量和方法。2.添加课程实现向课程目录中添加课程的功能。3.删除课......
  • C++ 模板编程技术解析
    一、函数模板函数模板实现通用函数,根据传递类型进行编译时实参推导:template<typenameT>Tadd(Ta,Tb){returna+b;}intmain(){intx=1,y=2;doublem=1.5,n=2.5;intz=add(x,y);doublep=add(m,n);return0;}这里te......
  • 数据类型转换
    数据类型转换低 ------------------------------------------------->高byte,short,char->int->long->float->doublepublicclasscase4{publicstaticvoidmain(String[]args){//byte,short,char-->int-->long-->float-->double......
  • C++/C的#pragma参数选项及其解析
    每种C和C++的实现支持对其宿主机或操作系统唯一的功能。例如,一些程序需要精确控制超出数据所在的储存空间,或着控制特定函数接受参数的方式。#pragma指示使每个编译程序在保留C和C++语言的整体兼容性时提供不同机器和操作系统特定的功能。编译指示被定义为机器或操作系统特定的,并且......
  • C/C++ 宏获取当前编译程序工作的CPU指令集平台(综合大全覆盖各类CPU)
    参考:https://blog.csdn.net/liulilittle/article/details/126644547?spm=1001.2101.3001.6650.6&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-6-126644547-blog-43935465.235%5Ev38%5Epc_relevant_default_base3&dep......