c++高级---C四种强制类型转换的总结

C++ 高级篇(四)—— 类型转换高级 目前为止,我们一直使用传统的类型转换符来进行简单对象的类型转换。例如,要把一个double类型的浮点型数字转换为int 的整型数字,我们是这样做的: int i; double d; i = (int) d; 或者 i = int (d); 这样做对基本数据类型时没问题的,因为基本数据类型的转换已经有标准的定义。同样的操作也可以被在类或类的指针上,因此以下例子中的写法也是没有问题的: 阅读详情

下面转自:http://www.cnblogs.com/alexqdh/archive/2011/06/09/2075713.html

C++的四种强制类型转换,所以C++不是类型安全的。分别为:static_cast , dynamic_cast , const_cast , reinterpret_cast

为什么使用C风格的强制转换可以把想要的任何东西转换成合乎心意的类型。那为什么还需要一个新的C++类型的强制转换呢?

新类型的强制转换可以提供更好的控制强制转换过程,允许控制各种不同种类的强制转换。C++中风格是static_cast<type>(content)。C++风格的强制转换其他的好处是,它们能更清晰的表明它们要干什么。程序员只要扫一眼这样的代码,就能立即知道一个强制转换的目的。

四种转换的区别:

static_cast:可以实现C++中内置基本数据类型之间的相互转换。

?
1
int c= static_cast < int >(7.987);

如果涉及到类的话,static_cast只能在有相互联系的类型中进行相互转换,不一定包含虚函数。

?
class A
{};
class B: public A
{};
class C
{};
  
int main()
{
     A* a= new A;
     B* b;
     C* c;
     b= static_cast <B>(a);  // 编译不会报错, B类继承A类
     c= static_cast <B>(a);  // 编译报错, C类与A类没有任何关系
     return 1;
}

const_cast: const_cast操作不能在不同的种类间转换。相反,它仅仅把一个它作用的表达式转换成常量。它可以使一个本来不是const类型的数据转换成const类型的,或者把const属性去掉。

reinterpret_cast: 有着和C风格的强制转换同样的能力。它可以转化任何内置的数据类型为其他任何的数据类型,也可以转化任何指针类型为其他的类型。它甚至可以转化内置的数据类型为指针,无须考虑类型安全或者常量的情形。不到万不得已绝对不用。

dynamic_cast: 

(1)其他三种都是编译时完成的,dynamic_cast是运行时处理的,运行时要进行类型检查。

(2)不能用于内置的基本数据类型的强制转换。

(3)dynamic_cast转换如果成功的话返回的是指向类的指针或引用,转换失败的话则会返回NULL。

(4)使用dynamic_cast进行转换的,基类中一定要有虚函数,否则编译不通过。

        B中需要检测有虚函数的原因:类中存在虚函数,就说明它有想要让基类指针或引用指向派生类对象的情况,此时转换才有意义。

        这是由于运行时类型检查需要运行时类型信息,而这个信息存储在类的虚函数表(关于虚函数表的概念,详细可见<Inside c++ object model>)中,

        只有定义了虚函数的类才有虚函数表。

 (5)在类的转换时,在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的。在进行下行转换时,dynamic_cast具有类型检查的功能,比               static_cast更安全。向上转换即为指向子类对象的向下转换,即将父类指针转化子类指针。向下转换的成功与否还与将要转换的类型有关,即要转换的指针指向的对象的实际类型与转换以后的对象类型一定要相同,否则转换失败。

参考例子:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include<iostream>
#include<cstring>
using namespace std;
class A
{
    public :
    virtual void f()
    {
        cout<< "hello" <<endl;
        };
};
  
class B: public A
{
     public :
     void f()
     {
         cout<< "hello2" <<endl;
         };
  
};
  
class C
{
   void pp()
   {
       return ;
   }
};
  
int fun()
{
     return 1;
}
int main()
{
     A* a1= new B; //a1是A类型的指针指向一个B类型的对象
     A* a2= new A; //a2是A类型的指针指向一个A类型的对象
     B* b;
     C* c;
     b= dynamic_cast <B*>(a1); //结果为not null,向下转换成功,a1之前指向的就是B类型的对象,所以可以转换成B类型的指针。
     if (b==NULL)
     {
         cout<< "null" <<endl;
     }
     else
     {
         cout<< "not null" <<endl;
     }
     b= dynamic_cast <B*>(a2); //结果为null,向下转换失败
     if (b==NULL)
     {
         cout<< "null" <<endl;
     }
     else
     {
         cout<< "not null" <<endl;
     }
     c= dynamic_cast <C*>(a); //结果为null,向下转换失败
     if (c==NULL)
     {
         cout<< "null" <<endl;
     }
     else
     {
         cout<< "not null" <<endl;
     }
     delete (a);
     return 0;
}

相关资料参考网址:

http://baike.baidu.com/view/1745213.htm

http://read.newbooks.com.cn/info/161950.html

 

 

下面转自:http://hb.qq.com/a/20110722/001452.htm

 C风格的强制类型转换(Type Cast)很简单,不管什么类型的转换统统是:

  

  TYPE b = (TYPE)a


  C++风格的类型转换提供了4种类型转换操作符来应对不同场合的应用。

  const_cast,字面上理解就是去const属性。

  static_cast,命名上理解是静态类型转换。如int转换成char。

  dynamic_cast,命名上理解是动态类型转换。如子类和父类之间的多态类型转换。

  reinterpreter_cast,仅仅重新解释类型,但没有进行二进制的转换。

  4种类型转换的格式,如:

  

  TYPE B = static_cast(TYPE)(a)


  const_cast

  去掉类型的const或volatile属性。

  

  struct SA {

  int i;

  };

  const SA ra;

  //ra.i = 10; //直接修改const类型,编译错误

  SA &rb = const_castSA&>(ra);

  rb.i = 10;


  static_cast

  类似于C风格的强制转换。无条件转换,静态类型转换。用于:

  1. 基类和子类之间转换:其中子类指针转换成父类指针是安全的;但父类指针转换成子类指针是不安全的。(基类和子类之间的动态类型转换建议用dynamic_cast)

  2. 基本数据类型转换。enum, struct, int, char, float等。static_cast不能进行无关类型(如非基类和子类)指针之间的转换。

  3. 把空指针转换成目标类型的空指针。

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

  5. static_cast不能去掉类型的const、volitale属性(用const_cast)。

  

  int n = 6;

  double d = static_castdouble>(n); // 基本类型转换

  int *pn = &n;

  double *d = static_castdouble *>(&n) //无关类型指针转换,编译错误

  void *p = static_castvoid *>(pn); //任意类型转换成void类型


  dynamic_cast

  有条件转换,动态类型转换,运行时类型安全检查(转换失败返回NULL):

  1. 安全的基类和子类之间转换。

  2. 必须要有虚函数。

  3. 相同基类不同子类之间的交叉转换。但结果是NULL。

  

  class BaseClass {

  public:

  int m_iNum;

  virtual void foo(){};

  //基类必须有虚函数。保持多台特性才能使用dynamic_cast

  };

  class DerivedClass: public BaseClass {

  public:

  char *m_szName[100];

  void bar(){};

  };

  BaseClass* pb = new DerivedClass();

  DerivedClass *pd1 = static_castDerivedClass *>(pb);

  //子类->父类,静态类型转换,正确但不推荐

  DerivedClass *pd2 = dynamic_castDerivedClass *>(pb);

  //子类->父类,动态类型转换,正确

  BaseClass* pb2 = new BaseClass();

  DerivedClass *pd21 = static_castDerivedClass *>(pb2);

  //父类->子类,静态类型转换,危险!访问子类m_szName成员越界

  DerivedClass *pd22 = dynamic_castDerivedClass *>(pb2);

  //父类->子类,动态类型转换,安全的。结果是NULL


  reinterpreter_cast

  仅仅重新解释类型,但没有进行二进制的转换:

  1. 转换的类型必须是一个指针、引用、算术类型、函数指针或者成员指针。

  2. 在比特位级别上进行转换。它可以把一个指针转换成一个整数,也可以把一个整数转换成一个指针(先把一个指针转换成一个整数,在把该整数转换成原类型的指针,还可以得到原先的指针值)。但不能将非32bit的实例转成指针。

  3. 最普通的用途就是在函数指针类型之间进行转换。

  4. 很难保证移植性。

  

  int doSomething(){return 0;};

  typedef void(*FuncPtr)();

  //FuncPtr is 一个指向函数的指针,该函数没有参数,返回值类型为 void

  FuncPtr funcPtrArray[10];

  //10个FuncPtrs指针的数组 让我们假设你希望(因为某些莫名其妙的原因)把一个指向下面函数的指针存入funcPtrArray数组:

  funcPtrArray[0] = &doSomething;

  // 编译错误!类型不匹配,reinterpret_cast可以让编译器以你的方法去看待它们:funcPtrArray

  funcPtrArray[0] = reinterpret_castFuncPtr>(&doSomething);

  //不同函数指针类型之间进行转换


  总 结

  去const属性用const_cast。

  基本类型转换用static_cast。

  多态类之间的类型转换用daynamic_cast。

  不同类型的指针类型转换用reinterpreter_cast。

 

【037】C++中的四种强制类型转换:static_cast、const_cast、dynamic_cast和reinterpret_cast详解 在学习C++类型转换之前,了解正确的转换方式至关重要。本文深入探讨了C++中的类型转换方法,从隐式转换到动态转换,展示了安全转换的重要性。通过上行和下行转换的比较,引领读者探寻类型转换的安全边界。静态转换、动态转换和常量转换的细致解读,助您在C++编程中运用恰当的转换技巧。 阅读详情

相关推荐

表格数据学习的图神经网络综述

今天学习一篇发表在中科院一区期刊《ACM Computing Surveys》的综述文章《Graph Neural Networks for Tabular Data Learning: A Survey with Taxonomy & Directions》,该刊主要刊载计算机理论方法领域的系统性综述与教程论文,注重跨学科技术融合研究,最新的影响因子为28.0。本文的目的在于通过学习这篇文章,了解关于表格数据学习点图神经网络一些基础知识。

qq_41009600的博客 799

C++的类型转换

C语言和C++都是强类型语言,如果赋值运算符左右两侧变量的类型不同,或形参与实参的类型不匹配,或返回值类型与接收返回值的变量类型不一致,那么就需要进行类型转换。C语言中有两种形式的类型转换,分别是隐式类型转换和显式类型转换:隐式类型转换:编译器在编译阶段自动进行,能转就转,不能转就编译失败。显式类型转换:需要用户自己处理,以`(指定类型)变量`的方式进行类型转换。需要注意的是,只有相近类型之间才能发生隐式类型转换,不相近类型之间只能进行强制类型转换。

2021dragon的博客 7571

ICCompiler II实战:从NDM生成到APR流程的完整避坑指南

本文是一份针对ICCompiler II(ICC II)后端物理实现流程的实战避坑指南。文章详细解析了从NDM库生成、设计初始化、布局规划到时钟树综合与布线的完整APR流程,重点分享了各环节的常见陷阱、精细化配置命令与调试经验,旨在帮助工程师高效达成PPA目标,确保设计一次成功。

p4q5r6s7t的博客 531

c++ 四种强制类型转换

转载自:https://blog.youkuaiyun.com/ydar95/article/details/69822540 const_cast , static_cast , dynamic_cast , reinterpret_cast 1. C风格的强制转换 C风格的强制转换(Type Cast)容易理解,不管什么类型的转换都可以使用使用下面的方式.  TypeName b = (Type...

u010540025的专栏 5万+

COCO2017数据集类别分布深度解析

本文深入解析了COCO2017数据集的类别分布情况,包括80个常见物体的分类统计和样本数量分析。通过对比训练集与验证集的分布一致性,探讨了数据均衡性问题,并针对高频和低频类别提出了实用的数据预处理和模型训练建议,帮助优化计算机视觉任务的性能。

weixin_42533751的博客 369

电路板功能测试系统-FCT for PCBA

电路板功能测试系统用于电路板组件(PCBA)的功能测试(FCT),满足自动化大批量生产的要求。  ● 用户根据自己需要定义测试步骤,灵活方便  ● 适合工业自动化大批量生产应用  ● 系统测试精度高,稳定可靠   一、电路板功能测试系统概述 电路板测试过程通常由多个步骤组成,每单个步骤中需要对多个物理量(电压、电流、电阻、频率、波形等)进行测试。在每个步骤测试时

6809

高级强制类型转换

高级强制类型转换

那年聪聪 505

YOLOP v2!YOLOv7结合YOLOP的多任务版本 更好、更快、更强

YOLOP v2!YOLOv7结合YOLOP的多任务版本 更好、更快、更强

jacke121的专栏 2705

C++ 高级强制类型转换

传统的强制类型转换 传统的强制类型转换:把所需要的指针类型放在一对圆括号之间,然后写出将被强制转换的地址值 例如: Company *company = new TechCompany("APPLE","IOS"); TechCompany* techcompany = (TechCompany*)company; 动态对象强制类型转换 传统的强制类型转换仍有一个问题:那就是万一被强制转换的类型和目标类型结构完全不同时,程序却会继续进行强制转换,这样的程序相当危险,随时有可能崩溃或被崩溃! 因为在类继

Chroniccandy的博客 918

Python爬虫实战:Boss直聘职位数据采集实战 - Playwright + 结构化解析完整方案(附CSV导出 + SQLite持久化存储)!

我长期专注 Python 爬虫工程化实战,主理专栏 《Python爬虫实战》:从采集策略到反爬对抗,从数据清洗到分布式调度,持续输出可复用的方法论与可落地案例。内容主打一个“能跑、能用、能扩展”,让数据价值真正做到——抓得到、洗得净、用得上。

喵手的博客 2185

Android Audio基础——系统服务(二)

AudioService 继承自 IAudioService.Stub。IAudioService.Stub 类很明显是通过 IAudioService.aidl 自动生成的。AudioService 位于 Binder Native 端。AudioManager 拥有 AudioService 的 Binder Proxy 端,是 AudioService 在客户端的一个代理。几乎所有客户端对 AudioManager 进行的请求,最终都会交由 AudioService 实现。

小旭的专栏 2071

第十一课 新的类型转换

C++ 类型转换

夜雨的博客 178

【信息系统项目管理师】第1章:信息化发展 考点梳理

本文主要详细梳理高项:信息化、新型基础设施建设、两化融合、数字中国、数字化转型与元宇宙等内容。

数据知道的博客 8567

学习过程中写的思维导图

一个代码产生的过程 static关键字

liang_Ri的博客 809

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

【C++高阶】C++类型转换全攻略:深入理解并高效应用

在C++的浩瀚宇宙中,类型转换作为连接不同类型数据之间的桥梁,扮演着至关重要的角色。它不仅关乎程序的正确性与效率,更是深入理解C++语言特性的重要一环。随着C++语言的不断演进,类型转换的规则与技巧也日益丰富和复杂,为开发者提供了强大的灵活性和表达力

EterNity_TiMe_的计算机学习之路 3089

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

《 C++ 点滴漫谈: 二十九 》C 风格 vs. C++ 风格:类型转换的对决与取舍

类型转换是 C++ 编程中的重要机制,用于在不同数据类型之间进行安全高效的转换。本博客系统介绍了 C++ 提供的四种类型转换运算符(static_cast、dynamic_cast、const_cast 和 reinterpret_cast)的用法及适用场景,分析了它们相较于 C 风格强制类型转换的优势,并深入探讨了类型转换的常见问题、最佳实践和性能优化技巧。此外,通过实际案例展示类型转换在泛型编程、性能优化和底层编程中的高级应用。本博客旨在帮助开发者深入理解类型转换的工作原理和潜在陷阱,写出更安全、可读、

Lenyiin 3413

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

C++高级特性:四种类型转换(九)

C++标准规定,试图修改一个被声明为。

weixin_43808717的博客 1049

C++ 类型转换

在C++中,类型转换是开发者经常需要处理的一部分内容。C++作为一种兼具高效性和灵活性的语言,提供了多种类型转换方式以应对不同的场景需求。本文将深入探讨C++中的类型转换,包括从C语言继承的隐式和显式类型转换,以及C++引入的四种强制类型转换。通过对这些转换方式的了解,开发者可以更好地控制程序的行为和优化代码的安全性。

wxk2227814847的博客 1410

强制类型转换

强制类型转换 1.C语言中的类型转换 在C语言中,如果赋值运算符左右两侧类型不同,或者形参与实参类类型不匹配,或者返回值类型与接收返回值类型不一致时,就需要发送类型转换。C语言中总共有两种形式的类型转换: 1.隐式类型转换:编译器在编译阶段自动运行,不能转就编译失败。 2.显示类型转换:需要用户自己处理。 int main() { //隐式类型转换(相近类型,意义相似的类型) int i = 10; double d = 6.66; i = d; cout << i <&

weixin_43554618的博客 868

C/C++编程学习 - 第1周 ⑦ 头文件、强制类型转换、递归

文章目录头文件引用头文件的语法引用头文件的操作只引用一次头文件有条件引用强制类型转换整数提升常用的算术转换递归数的阶乘斐波那契数列 头文件 头文件包含了 C 函数声明和宏定义,被多个源文件中引用共享。有两种类型的头文件:程序员编写的头文件和编译器自带的头文件。 在程序中要使用头文件,需要使用 C 预处理指令 #include 来引用它。前面我们已经看过 stdio.h 头文件,它是编译器自带的头文件。 引用头文件相当于复制头文件的内容,但是我们不会直接在源文件中复制头文件的内容,因为这么做很容易出错,特别在

水蛙菌 9993

高级对象强制类型转换

静态对象强制类型转换 还是那个例子 #include <iostream> #include <string> class Company { public: Company(std::string theName, std::string product); virtual void printInfo(); protected: std::string ...

weixin_38252896的博客 293

高级强制类型转换——C++(38)

高级强制类型转换 静态对象强制类型转换 new函数返回的是指针 代码实现 1/2 静态对象强制类型转换 #include <iostream> #include <string> using namespace std; class Company { public: Company(string theName,string product); vi...

weixin_44108747的博客 233

C++高级使用技巧:强制类型转换

在C语言中,如果表达式赋值运算符左右两侧变量或表达式的数据类型不同,或者形参变量与实参变量类型不匹配,或者返回值变量类型与接收值类型不一致时,就需要进行类型转化,C++语言中总共有两种形式的类型转换:隐式类型转换和显式类型转换。隐式类型转化是编译器在自动进行,能转就转,不能转就会发生编译失败;而显式类型转化(强转)是用户自己进行类型转换操作。

qq_36756667的博客 719

qt / c++ 强制类型转换

qt / c++ 强制类型转换

ken2232的博客 606

C++11类型转换:从C风格强制转换到四种安全操作符的演进

类型转换是编程语言中处理不同类型数据间转换的基础机制,其核心原理是在保持数据语义的前提下实现内存表示的重新解释或计算。在C++编程实践中,类型安全是构建健壮系统的关键技术价值,它能在编译期捕获潜在的类型错误,避免运行时未定义行为。C++11引入的四种强制类型转换操作符——static_cast、dynamic_cast、const_cast和reinterpret_cast——正是这一理念的体现,它们分别针对不同的应用场景:static_cast用于编译期可确定的合规转换,dynamic_cast提供运行时

weixin_34184158的博客 343

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

原文:http://www.cnblogs.com/alexqdh/archive/2011/06/09/2075713.html  C++的四种强制类型转换,所以C++不是类型安全的。分别为:static_cast , dynamic_cast , const_cast

helonSY欢迎您的到来! 513
上一篇: OGRE启动顺序--以及官方示例程序分析
下一篇: Ogre监听器原理详解
HNFXS985
博客等级 码龄14年 219粉丝 150原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值