首页 > 编程语言 >c++中的四种cast转换?

c++中的四种cast转换?

时间:2023-09-21 13:33:38浏览次数:47  
标签:转换成 dynamic c++ cast 引用 类型 四种 指针

c++中的四种cast转换是:static_cast,const_cast,dynamic_cast,reinteroret_cast;

static_cast:

1.用于类层次结构中父类和子类之间指针或引用的转换。进行多态向上转换(子类指针或引用转换成父类)是安全的,多态向下转化是不安全的(把父类指针或引用转换成子类的指针或引用,没有动态类型检查)

2.用于基本的类型转换,如把int转换成char,int转换成enum。这种转换的安全性也要开发人员来保证。

3.把void指针转换成目标类型指针(不安全)

4.把任何类型的表达式转化成void类型。

const_cast:主要用来修改类型的const或volatile属性。除了去掉const或volatile修饰之外。type_id和expression得到的类型是一样的。但需要特别注意的是const_cast不是用于去除变量的常属性,而是去除指向常数对象的指针或引用的常属性,其去除常属性的对象必须为指针或引用。

dynamic_cast :主要用在继承体系中安全向下转型。它能安全地将指向基类地指针转型为指向子类的指针或引用,并获知转型动作是否成功。转型失败会返回NULL(转型对象为指针)或抛出异常bad_cast(转型对象为引用时)。

dynamic_cast会动用运行时信息(RTTI)来进行类型安全检查。因此dynamic_cast存在一定的效率损失。当使用dynamic_cast时,该类型必须有虚函数,这是因为dynamic_cast使用了存储在虚函数表中的信息来判断实际的类型。RTTI运行时类型识别用于判断类型。typeid表达式的形式typeid(e),typeid操作的结果是一个常量对象的引用,该对象的类型是type_info或type_info的派生。

reinteroret_cast:它可以把一个指针转换成一个整数,也可以将一个整数转换成一个指针。任何类型之间的转换。一般不建议使用

标签:转换成,dynamic,c++,cast,引用,类型,四种,指针
From: https://www.cnblogs.com/heartoftheleaf/p/17719752.html

相关文章

  • c++ 引用
     引用最大的价值是避免复制 #include<iostream>usingnamespacestd;voidmethod2(int&param){param=param+1;cout<<"method2inner:"<<param<<endl;//method2inner:2}voidmethod1(intparam){param=pa......
  • c++中指针和引用的区别?
    1.指针是一个实体,需要分配内存空间,引用是一个变量的别名,不需要分配内存空间。2.引用在定义的时候必须进行初始化,并且不能改变。引用的值不能为NULL,指针在定义的时候不一定要初始化,并且指针所指向的空间是可变的,可以指向NULL。3.sizeof指针得到的是指针本事的大小,sizeof引用得到......
  • 【c&c++】C++中memset()函数的用法详解
    头文件:cstring 或 memory话说刚开始使用memset的时候一直以为memset是对每一个int赋值的,心里想有了memset还要for循环对数组进行初始化干嘛。但其实memset这个函数的作用是将数字以单个字节逐个拷贝的方式放到指定的内存中去memset(dp,0,sizeof(dp));int类型的变量一般占......
  • c++ 读写注册表
    classCConfig{HKEY_hKey;public:~CConfig(){if(_hKey){RegCloseKey(_hKey);}}CConfig():_hKey(0){}LSTATUSSave(PCWSTRlpValueName,DWORDdwType,co......
  • c++ 简单模拟js Promise
    main:#include<stdio.h>#include"common.h"#include"promise.h"#include<chrono>//std::chrono::seconds#include<thread>//std::this_thread::sleep_forintmain(void){Promise*pro=newPromise([](ca......
  • C++ 程序员入门需要多久,怎样才能学好?
    学习成为一名熟练的C++程序员需要时间和努力,具体的时间取决于个人的学习速度、学习方法和学习目标。以下是一些建议,以帮助您入门并学好C++:基础知识学习(数周至数月):开始学习C++的基础语法,包括变量、数据类型、运算符、控制流程(如条件语句和循环)、函数等。学习C++标准库,包括常用的容器......
  • C++ 左/右值及其引用 论述
    说明:本文探讨的是C++11以来的值类别关于左值和右值,在不对其进行详细的划分时,简单的分类方法包括左值持久,右值短暂能取得地址得通常是左值,反之通常是右值(这一方法启示我们一个表达式的类型与其是左值还是右值无关,即相同类型的表达式既可以是左值也可以是右值)右......
  • C++中的四种类型转换运算符
    隐式类型转换是安全的,显式类型转换是有风险的,C语言之所以增加强制类型转换的语法,就是为了强调风险,让程序员意识到自己在做什么。但是,这种强调风险的方式还是比较粗放,粒度比较大,它并没有表明存在什么风险,风险程度如何。再者,C风格的强制类型转换统一使用(),而()在代码中随处可见,所以......
  • c++ 访问全局变量
      #include<iostream>usingnamespacestd;inta{1};intmain(){inta{123};cout<<"外部的a:"<<a<<endl;//外部的a:123{cout<<"外部的a:"<<a<<endl;//外部的a:123......
  • C++的构造函数和析构函数
    背景介绍在B站上看完侯捷老师讲解的两个类:String类andcomplex类,这两个类的实现体现了不带指针和带指针的区别,也可以作为设计类的参考学习。这两个类的实现过程中有很多小细节的东西需要注意,否则很可能造成编译报错。编写带指针的类String在c++的ansi库中有有一个string类,用......