C/C++ 类型转换

2024年C C++最全如何把CPP源程序改写成C语言?_如何把c程序变为c文件,2024年最新涨姿势了 /将函数指针初始化。void IA(A *p) //构造函数,命名规则在类名前加I。//原构造函数所作部分。 阅读详情

C语言的强制类型转换与C++的四种转换类型的方式。
这篇博客将详细讲解其中的用法!



一、前言

类型转换在项目开发中是经常使用的,熟悉C语言的朋友,用的最多的应该是强制类型转换了,例如:
double d = 3.14; int a = (int)d;
这种方式确实可以,今天这篇博客重点讲解C++是如何类型转换的!

旧式转型 C风格的强制类型:
TYPE b = (TYPE) a
例如:
int i = 48;
char c = (char) i;

新式转型 C++风格的类型转换提供了4种类型转换操作符来应对不同场合的应用。
格式:
TYPE b = 类型操作符< TYPE > ( a )
类型操作符= static_cast | reinterpreter_cast | dynamic_cast | const_cast


二、类型转换

1. C语言类型转换

C语言的类型转换也就只有强制类型转换这一种,如下例子:

#include <iostream>

using namespace std;


int main1(void) {

	double radius = 7.54;

	int a1 = radius;		// 隐式类型转换
	int a2 = (int)radius;	// 强制类型转化,把double转成int

	char c = 'c';
	char *c1 = &c;
	int *a3 = (int *)c1;	// 指针也可以进行强制类型转换

	int* addr = (int *)0x66666;

	return 0;
}

这没什么好讲的,大家都会!

2. C++类型转换

1). static_cast

静态类型转换(斯文的劝导,温柔的转换)。如int转换成char
主要用法:
a. 用于类层次结构中基类(父类)和派生类(子类)之间指针或引用的转换。上行指针或引用(派生类到基类)转换安全,下行不安全
b. 用于基本数据类型之间的转换,如把int转换成char,把int转换成enum。这种转换的安全性也要开发人员来保证。
c. 把空指针转换成目标类型的空指针。
d. 把任何类型的表达式转换成void类型。

例:
定义一个Animal虚基类,里面有cry()虚函数;再定义两个派生类Cat和Dog,分别重写虚函数。

class Animal {
public:
	virtual void cry() = 0;
};

class Cat : public Animal {
public:
	void cry() {
		cout << "喵喵喵~" << endl;
	}
};

class Dog : public Animal {
public:
	void cry() {
		cout << "汪汪汪~" << endl;
	}
};
  1. 第一种情况:父子类之间的类型转换

    Dog *dog1 = new Dog();
    Animal *d1 = static_cast<Animal *>(dog1);	// 子类的指针转型到父类指针
    
    Dog *dog2 = static_cast<Dog *>(d1);			// 父类的指针转型到子类指针
    Cat *cat1 = static_cast<Cat *>(d1);		// 这样是不可以的,虽然可以编译通过,但是不太建议这样使用
    
    
    Dog dog3;
    Animal &d2 = static_cast<Animal &>(dog3);	// 子类的引用转型到父类的引用
    
    Dog &dog4 = static_cast<Dog &>(d2);			// 父类的应用转型到子类的引用
    
  2. 第二种情况:基本类型的转换

    int x = 123;
    char c = static_cast<char>(x);
    
  3. 第三种情况:把空指针转换成目标类型的空指针

    int *p = static_cast<int *>(NULL);	// 等同于 int *p = NULL;
    Dog *g = static_cast<Dog *>(NULL);	// 等同于 Dog *g = NULL;
    
  4. 第四种情况:把任何类型的表达式转换成void类型

    int *array = new int[10];	
    void *arr = static_cast<void *>(array);	// 等同与 void *arr = array;
    

2). reinterpret_cast

重新解释类型(挂羊头,卖狗肉) 不同类型间的互转,数值与指针间的互转

用法: TYPE b = reinterpret_cast ( a )
TYPE必须是一个指针、引用、算术类型、函数指针.

忠告:滥用 reinterpret_cast 运算符可能很容易带来风险。 除非所需转换本身是低级别的,否则应使用其他强制转换运算符之一。

例:
定义一个Animal基类,里面有cry()纯虚函数;再定义两个派生类Cat和Dog,分别重写虚函数。

class Animal {
public:
	virtual void cry() {
		cout << "动物叫!" << endl;
	}
};

class Cat : public Animal {
public:
	void cry() {
		cout << "喵喵喵~" << endl;
	}
};

class Dog : public Animal {
public:
	void cry() {
		cout << "汪汪汪~" << endl;
	}
};
  1. 用法一:数值与指针之间的转换

    int *p = reinterpret_cast<int *>(0x666666);
    int var = reinterpret_cast<int>(p);
    
  2. 用法二:不同类型指针和引用之间的转换

    Dog dog1;
    Animal *a1 = &dog1;
    a1->cry();
    
    // 父类指针对象强转为子类对象
    Dog *dog_1 = reinterpret_cast<Dog *>(a1);
    Dog *dog_2 = static_cast<Dog *>(a1);	// 能用static_cast的地方优先使用static_cast
    dog_1->cry();
    dog_2->cry();
    
    
    //Cat *cat_1 = static_cast<Cat *>(dog_1);	// 不同类型指针转换不能使用static_cast
    Cat *cat_1 = reinterpret_cast<Cat *>(dog_1);	// 将狗指针对象转换为猫指针对象
    cat_1->cry();
    
    
    // 引用之间的转换
    Animal &a2 = dog1;
    Dog &dog2 = reinterpret_cast<Dog &>(a2);
    

运行结果:
在这里插入图片描述

3). dynamic_cast

动态类型转换:

a. 将一个基类对象指针cast到继承类指针,dynamic_cast 会根据基类指针是否真正指向继承类指针来做相应处理。失败返回null,成功返回正常cast后的对象指针;

b. 将一个基类对象引用cast 继承类对象,dynamic_cast 会根据基类对象是否真正属于继承类来做相应处理。失败抛出异常bad_cast

注意:dynamic_cast在将父类cast到子类时,父类必须要有虚函数一起玩。

简单来说,当你定义一个基类对象,然后将子类对象赋值给它时,然后你使用dynamic_cast转换为该子类对象,这样是没问题的,如果转换为另一个子类对象,如果是指针,则为NULL;如果是引用则发生异常。

例:
定义一个Animal虚基类,里面有cry()虚函数;再定义两个派生类Cat和Dog,分别重写虚函数。
再定义两个重载函数,用于类型转换例子演示:

class Animal {
public:
	virtual void cry() = 0;
};

class Cat : public Animal {
public:
	void cry() {
		cout << "喵喵喵~" << endl;
	}
};

class Dog : public Animal {
public:
	void cry() {
		cout << "汪汪汪~" << endl;
	}
};


void PlayAnimal(Animal *animal) {
	// 如果传入的参数是Dog类型,那么可以转换成功,否则为NULL
	Dog *dog = dynamic_cast<Dog *>(animal);

	if (dog) {
		cout << "这是狗,汪汪汪~" << endl;

	} else {
		cout << "这是猫,喵喵喵~" << endl;
	}
}

void PlayAnimal(Animal &animal) {

	try {
		// 转换引用,如果失败则会抛出异常
		Cat &cat = dynamic_cast<Cat &>(animal);

		cout << "这是猫,";
		cat.cry();

	} catch (std::bad_cast bc) {
		Dog &dog = dynamic_cast<Dog &>(animal);
		
		cout << "这是狗,";
		dog.cry();
	}

}
  1. 指针之间父类转子类的转换

    /* 指针间的转换 */	
    Dog *dog1 = new  Dog();
    Animal *a1 = dog1;
    PlayAnimal(a1);		// void PlayAnimal(Animal *animal) 
    
    Cat *cat1 = new Cat();
    Animal *a2 = cat1;
    PlayAnimal(a2);
    

cout << endl << “华丽的分割线==================================” << endl << endl;

  1. 引用之间父类转子类的转换

    /* 引用之间的转换 */
    Dog dog2;
    PlayAnimal(dog2);	// void PlayAnimal(Animal &animal)
    
    Cat cat2;
    PlayAnimal(cat2);
    

运行截图:
在这里插入图片描述

4). const_cast

去const属性。(仅针对于指针和引用)

简单来说,就是将常量变量转换为普通变量进行修改值;
但是这其中有一个点要注意,这个常量必须是要可以修改的内存,否则转换过程中会报错!

例:
定义一个函数用于转换字符串数组

void demo(const char *p) {
	// 去除const修饰符
	char *p1 = const_cast<char *>(p);
	p1[0] = 'A';

	// 可以直接进行使用
	const_cast<char *>(p)[1] = 'B';

	cout << p1 << endl;
}
  1. 常量字符串数组

    const char p[] = "123456";
    demo(p);
    

    因为他是一个数组,所以里面的值是可以被修改的

  2. 常量字符串不能去掉const修改
    警告:再去掉常量限定字符之前,保证指针所指向的内存能够修改,不能修改则会引起异常

    const char *cp = "12345678";
    char *cp1 = const_cast<char *>(cp);		
    cp1[0] = 'C';	// 会抛异常,报错!!!
    cout << cp1 << endl;
    

    在这里插入图片描述

  3. 修改指针变量

    int x = 10;
    const int *a = &x;
    int *b = const_cast<int *>(a);
    *b = 20;
    cout << *b << endl;
    

运行截图:
在这里插入图片描述


三、类型转换使用建议

  1. static_cast静态类型转换,编译的时c++编译器会做编译时的类型检查;隐式转换;
    基本类型转换,父子类之间合理转换

  2. 若不同类型之间,进行强制类型转换,用reinterpret_cast<>() 进行重新解释
    建 议:
    C语言中 能隐式类型转换的,在c++中可用 static_cast<>()进行类型转换。因C++编译器在编译检查一般都能通过;C语言中不能隐式类型转换的,在c++中可以用 reinterpret_cast<>() 进行强制类型解释。

    总结:static_cast<>()和reinterpret_cast<>() 基本上把C语言中的 强制类型转换给覆盖,注意reinterpret_cast<>()很难保证移植性。

  3. dynamic_cast<>(),动态类型转换,安全的虚基类和子类之间转换;运行时类型检查

  4. const_cast<>(),去除变量的只读属性


四、总结

最后的忠告:程序员必须清楚的知道: 要转的变量,类型转换前是什么类型,类型转换后是什么类型,转换后有什么后果。

一般情况下,不建议进行类型转换;避免进行类型转换。

C和C++的强制类型转换 C++ 四种强制类型转换 一般来说,我们需要类型转换的场景可以分为如下几种: 整型和浮点型以及不同长度的数据相互转换 一般规则是:占用内存低的向占用内存高的自动转换,而反向则会有转换截断的问题 整型和指针相互转换 当我们试图根据某个成员变量的偏移位计算其在该对象内存空间位置时,就会需要将指针转换为整型进行计算。当计算出该变量的位置后(整型),就需要将其转换为指针类型。 整型和枚举类型相互转换。 这种转换往往发生在数学计算的场景下。因为枚举一般只是用于表意,而实际参与运算的还是整型数据。 指针 阅读详情

相关推荐

C/C++中奇妙的类型转换

盘点C/C++中的类型转换

知其然 知其所以然 1634

c++转为c程序

目前项目中,涉及到了把c++文件改为c文件,主要是c++跨平台存在问题,所以才需要这样做。特此记录。简说:1、C++兼容C语言,但C语言不可能兼容C++,所以,C++代码直接转是转不了C的。2、只能从逻辑上,对C++的许多语法进行代码上的重新实现。    比如将对象转换为结构体,将对象封装的函数修改为独立函数,增加对象参数。    将重载去掉,而是根据需要调用非重载的不同名的函数。    要将C+...

Tobiubiu 2万+

C/C++类型转换的本质

在 C/C++ 中,不同的数据类型之间可以相互转换:无需用户指明如何转换的称为自动类型转换(隐式类型转换),需要用户显式地指明如何转换的称为强制类型转换(显式类型转换),这点已在《C++转换构造函数》中进行了说明。 隐式类型转换利用的是编译器内置的转换规则,或者用户自定义的转换构造函数以及类型转换函数(这些都可以认为是已知的转换规则),例如从 int 到 double、从派生类到基类、从type *到void *、从 double 到 Complex 等。 type *是一个具体类型的指针,例如int *、

qq_33287871的博客 930

如何将C++改为C

我曾参与过公司的bpp项目,就是bluetooth print profile。由于使用了hpijs的开源包,但是是C++的。由于C++解释器比C语言解释器占用的存储空间要大500k左右。为了节省有限的存储空间,降低成本,同时也为了提高效率,将用C++语言写的源程序用C语言改写是很有必要的。        C++与C区别最大的就是C++中的类的概念和特性,将C++改为C的问题,就转换成如何将

David_xtd的专栏 1万+

一个c++转c的工具(cfront源码)

一个c++转c的工具(cfront源码),很好的工具源代码。满足特殊人使用。

C++转CTrump语法工具

这是C++转CTrump语法工具,只需将C++代码粘贴到窗口左侧的输入框,点击‘GO’,就可以转换成带有CTrump语法特点的C++代码 注:转换出的代码可直接用C++编译器编译,并且能够完美运行。

C/C++类型转换

本文介绍了C/C++的类型转换知识。C语言有隐式和显式转换,隐式转换由编译器自动完成,遵循向上转换原则;显式转换即强制转换,需用运算符指定。C++在此基础上扩展,隐式转换支持内置与自定义类型等多种转换,可通过构造函数、转换函数实现,还能用`explicit`禁止隐式转换。C++显式转换有`static_cast`(常用安全转换)、`reinterpret_cast`(不相关类型转换)、`const_cast`(去除const属性)、`dynamic_cast`(类层次安全转换,依赖RTTI和虚函数)。

如果这是最后一页 能否让我把故事重写 1299

Qwen3-VL、Qwen3-Next与Qwen3.5多模态架构深度解剖

多模态大模型的核心不在参数规模,而在于视觉与文本如何协同建模。本文从基础概念切入,解析视觉语言模型中视觉编码器、跨模态注意力、特征对齐与token压缩等关键原理;阐述ViT、CLIP-ViT及动态压缩模块(HDTC)在语义表征、空间感知与计算效率上的技术权衡;强调结构设计如何决定模型在医学影像、工业质检、遥感分析等高要求场景中的真实能力边界;最终聚焦通义千问最新三套VL架构——Qwen3-VL、Qwen3-Next与Qwen3.5——揭示其背后迥异的融合哲学与工程取舍,为选型、微调与推理优化提供底层依据。

weixin_33778544的博客 817

C/C++的类型转换

因为要兼容C语言的类型转换,所以C++ 当中的类型转换最多只是一个建议,不强制使用,但在很多公司中会明确说明要使用C++当中的类型转换来进行规范书写和避免错误。我们在平时写代码的时候,也尽量使用C++当中的类型转换,养成良好习惯。

yin_ming_hui的博客 1820

OnlyOffice Docker部署实战:解除20连接限制+500M文件上传配置(附中文字体解决方案)

本文详细介绍了OnlyOffice企业级Docker部署的全过程,包括解除20并发连接限制、提升文件上传大小至500MB以及解决中文字体显示问题。通过定制镜像、优化配置和字体安装,帮助技术团队快速搭建高性能的文档协作平台,适用于企业级应用场景。

weixin_26850069的博客 440

Android Studio打包全攻略---从入门到精通

初出茅庐 手动打包怎么手动打包项目写完了,现在需要把应用上传到市场,问题出现—怎么把代码变成.apk(Android的可安装文件)。 1. 创建签名文件 2. 填写好签名参数 3. 生成APK 注意:签名的密码和密匙的密码注意保管,不要忘了,签名文件别泄漏了,也别搞丢了为什么要打包我最开始就有这个疑问,我们的代码不是点了下运行按钮就直接安装到手机上了吗,我们在在项目Project

我早就想,要这样载着你,翻山越岭 2万+

【C++】C/C++中的类型转换

在 C 语言里,隐式转换是编译器自动进行的类型转换操作,不需要程序员手动干预。

Antonio915的博客 1306

MATLAB配置MinGW编译器的完整指南

本文提供了在Windows系统上为MATLAB配置MinGW编译器的完整指南。详细介绍了通过MATLAB附加功能管理器在线安装和手动离线安装两种核心方法,并重点说明了如何解决常见的“未找到支持的编译器”等错误。指南包含从版本检查、环境变量配置到最终使用mex命令验证的每一步,帮助用户顺利完成MATLAB与MinGW的集成,以支持C/C++代码编译。

weixin_29031057的博客 263

C/C++类型转换全解析

本文介绍了C++中的四种类型转换机制。相比C语言的隐式和显式转换,C++提供了更安全、语义更明确的四种转换方式:static_cast用于相关类型间的转换;reinterpret_cast用于位模式重新解释;const_cast用于修改const/volatile属性;dynamic_cast用于多态类型的运行时安全转换。文章详细分析了每种转换的适用场景、优势及注意事项,强调应避免滥用强制类型转换,特别是危险的reinterpret_cast。最后通过面试题总结了四种转换的应用场景,帮助开发者根据具体需求选

码达拉的博客 1157

vcs覆盖率相关

选择要查看的覆盖率点,右键选择 show xxx tests;

qq_40571921的博客 2384

Power domain 划分该如何下手

假如PD1比PD3更always on的话,我们只需要插入普通buffer即可,因为PD3 on,PD1也肯定是ON,PD1 off,PD3肯定时off,PD1能cover PD3的电源情况,因此使用普通buffer也可,但是处于省电角度,我们还是使用AO buffer;在我们做多power domain时,在切分power domain时,需要谨慎,稍有不慎,就会出现congestion以及timing问题,那问题来了,我们在切分power domain时有什么考究么,今天小编就和大家一起讨论讨论。

芯冰乐 206

C/C++的显式类型转换

C/C++的显式类型转换         在C/C++中,我们可以显式地将某个值、变量或对象强制转换成某种特定的类型。 C          C语言中的显示类型转换非常简单,直接用括号把所需要转换的数据类型括起来放在值的左边即可: int a = 100; long b = (long)a;         但是,还有一种是把值(变量)用括号括起来放在类型前面的做法: int a

Fish的专栏 4642

ccSwitch 安装使用指南,claude code的最佳搭档

ccSwitch 是一款真正为 AI 编程开发者打造的效率工具。它把原本繁琐的配置管理工作,简化成了直观的图形界面操作。无论你是需要在多个 API 提供商之间切换,还是想要统一管理多款 AI 编程工具,ccSwitch 都能帮你大幅提升效率。如果你是重度 AI 编程工具用户,强烈推荐尝试一下 ccSwitch,相信它会成为你开发工具箱中不可或缺的一员。项目地址。

篮球界最会写bug的人;程序猿中打球最菜的人。 1282

C/C++ 类型转换的本质

在 C 和 C++ 中,**类型转换**是一种将数据从一种类型转变为另一种类型的操作。它的核心在于改变编译器对数据的解读方式,有时伴随值的实际变化,有时仅改变数据的解释方式而不改变底层的二进制表示。 类型转换是程序开发中不可避免的操作,但它也带来了潜在的性能问题和隐患,因此理解其本质至关重要。

weixin_45613635的博客 712

把 SAP ABAP BDC 跑得又快又稳:从 SHDB 录屏到可上线的批量上传程序(含 MM01 案例与源码)

SAP BDC批量数据迁移实践 摘要:本文介绍了SAP系统中BDC(Batch Data Communication)技术在数据迁移中的应用。文章首先对比了Session method和CALL TRANSACTION method两种实现方式的特点及适用场景,重点推荐使用Session method进行主数据批量处理。然后详细讲解了通过SHDB工具录制MM01事务创建物料主数据的完整流程,包括如何生成基础BDC代码。最后展示了将录制的脚本改造为可批量处理文件数据的实用程序,核心改动包括定义数据结构、读取文

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 322

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

C/C++共有的类型转换与c++特有的四种强制类型转换

c++特有的四种强制类型转换

cyz322649的博客 992

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

C/C++强制类型转换的底层原理与应用

强制类型转换是C/C++中改变数据解读方式的机制,通过特定语法让编译器以目标类型规则解析内存数据。其本质是切换二进制数据的解读规则,而非修改原始数据(除非涉及数值范围转换)。主要应用场景包括:适配通用接口(如void*)、操作硬件地址、解析二进制数据、数值类型适配和回调函数处理。但使用不当会导致数据失真、内存越界等问题,需谨慎验证转换结果。这种机制如同更换镜头观察同一段内存,改变了数据呈现方式而内存本身不变,是底层开发的重要工具。

Shylock_Mister的博客 1940

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

C/C++中 float与uint16类型转换方法

C/C++中 float与uint16类型转换方法为什么要做float与uint16互相转换方法一:方法二: 为什么要做float与uint16互相转换 此需求在串口通信时常常会被用到,串口只能以字符型(char)进行通信,如果要首发浮点型(float),使用浮点转字符串的方法就比较麻烦。 方法一: 利用库函数: C/C++语言提供了几个标准库函数,可以将字符串转换为任意类型(整型、长整型、浮点型等)。 atof():将字符串转换为双精度浮点型值。 atoi():将字符串转换为整型值。 但他们不适用于跨平台

qq_39016531的博客 2万+

C/C++中类型转换方式

C/C++中的类型转换分为隐式和显式两种。隐式转换由编译器自动完成,如int转float;显式转换需程序员手动指定,如(float)x。C++引入四种强制转换运算符:static_cast(安全类型转换)、dynamic_cast(多态类转换)、const_cast(去除const)、reinterpret_cast(低级指针转换)。构造函数转换和类型转换运算符可实现类与其他类型的互转,explicit关键字可防止隐式转换带来的潜在问题。类型转换可能导致数据丢失、精度损失、未定义行为等问题,需谨慎使用以确保

2302_80908313的博客 759

C/C++类型转换(一)

对于C/C++来说,基本上所有的内容都可以从内存说起,所以还是接着说C/C++内存的事,这里主要介绍一下在C/C++中使用比较多的类型转换,其实主要是C,因为C++在C++11中引入了更安全的类型转换方式,下一篇介绍。 如有侵权,请联系删除,如有错误,欢迎大家指正,谢谢 C/C++中的类型转换主要分为:隐式类型转换 & 显示类型转换(即强制类型转换) 隐式类型转换 在C Primer Pl...

xiao_ma_nong_last的博客 307
上一篇: C++11 新特性 之 explicit关键字 - 显示构造与隐式构造
下一篇: C/C++ 七大排序算法 之 “归并排序”
cpp_learners
博客等级 码龄7年 1526粉丝 274原创
评论 9
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cpp_learners

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值