【C++11及其特性】C++类型转换

news2024/9/20 20:35:05

C++类型转换目录

  • 一.C语言的强制类型转换
  • 二.static_cast
    • 1.父类子类之间指针或引用的转换
    • 2.基本数据类型的转换
    • 3.空指针转换其他类型指针
    • 4.其他类型指针转换为空指针
    • 5.static_cast特点
    • 6.完整代码
  • 三.reinterpret_cast
    • 1.数值与指针之间的转换
    • 2.不同类型指针和引用之间的转换
    • 3.reinterpret_cast特点
    • 4.完整代码
  • 四.dynamic_cast
    • 1.基类指针转换为继承类指针
    • 2.基类引用转换为继承类引用
    • 3.dynamic_cast特点
    • 4.完整代码
  • 五.const_cast
    • 1.去除const属性
    • 2.const_cast特点
    • 3.完整代码
  • 六.类型转换怎么使用合适
    • 1.static_cast
    • 2.reinterpret_cast
    • 3.dynamic_cast
    • 4.const_cast
    • 5.最后的忠告
    • 6.c++大牛建议

一.C语言的强制类型转换

这个我不说,你们都知道了吧,就是(强制转换类型)类型
因为c++有新引入了类这些,所以我们来看看c++的类型转换.

二.static_cast

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

完整代码在下面可以对比来学.
子类的指针可以转换为父类.
平时我们可能直接都是隐式转换,直接Animal*a1=dog1;

父类指针也可以转换为子类指针.
在这里插入图片描述

现在来看看引用,父与子之间也可以相互转换.

在这里插入图片描述

2.基本数据类型的转换

平时我们可能直接隐式转换 char c=n;直接这样.
在这里插入图片描述

3.空指针转换其他类型指针

NULL就是空指针.
在这里插入图片描述

平时我们可能就写成的int*p=NULL;
在这里插入图片描述

4.其他类型指针转换为空指针

在这里插入图片描述

5.static_cast特点

  • 比较’温柔’,隐式转换的差不多都可以用static_cast来进行转换
  • 编译器会做一个检测,转换是否合理.
  • 不支持不同类型的指针或引用转换

6.完整代码

#include <iostream>
using namespace std;

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

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

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

int main()
{
	Dog* dog1 = new Dog();
	Animal* a1 =static_cast<Animal*> (dog1);//子类的指针转型到父类指针
	
	a1 = dog1;//父类指针指向指向子类对象

	Dog* dog = static_cast<Dog*>(a1);//父类的指针转型到子类指针
	Cat* cat = static_cast<Cat*>(a1);
	//dog = a1;//这样是不允许的,有一定的风险

	Dog dog2;
	Animal& a2 = static_cast<Animal&> (dog2);
	Dog&dog3 = static_cast<Dog&>(a2);



	int n = 100;
	char c = static_cast<char>(n);
	c = n;

	
	int* p = static_cast<int*>(NULL);
	p = NULL;


	int* p1 = new int;
	void* p2 = static_cast<void*>(p1);
	p2 = p1;
	
	return 0;
}

三.reinterpret_cast

1.数值与指针之间的转换

在这里插入图片描述

2.不同类型指针和引用之间的转换

父与子都可以进行指针和引用的转换.
而且还可以进行不同类型之间的转换.
在这里插入图片描述

3.reinterpret_cast特点

  • static_cast是’温柔’的,那么reinterpret_cast则是强烈的.
  • 可以数值与指针之间的转换.
  • 可以不同指针类型之间的转换.
  • 当然强制可能导致部分数据丢失.

4.完整代码

#include <iostream>
using namespace std;

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

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

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

int main()
{
	int* p = reinterpret_cast<int*> (0x88888);
	int val = reinterpret_cast<int>(p);

	Dog *dog1=NULL;
	Animal* a1 = reinterpret_cast<Animal*>(dog1);
	Animal* a3 = static_cast<Animal*>(dog1);//能用static_cast<>就用这个

	Dog dog;
	Animal* a2 = &dog;
	a2->cry();

	Dog* dog2 = reinterpret_cast<Dog*>(a2);
	Dog* dog3 = static_cast<Dog*>(a2);//能用static_cast<>就用这个

	Cat* cat = static_cast<Cat*>(dog2);
	Cat* cat = reinterpret_cast<Cat*>(dog2);//不同类型也可以转换

	Animal& a4 = dog;
	Dog& dog4 = reinterpret_cast<Dog&>(a4);

	dog2->cry();
	cat->cry();

	return 0;
}

四.dynamic_cast

1.基类指针转换为继承类指针

虚基类的话,那么我们就可以玩多态.
在这里插入图片描述
父类指针指向子类指针时,就可以发送多态.
但是当我们想要调用子类特有的函数时.
那么我们需要在函数中类型转换为子类.
这时我们就可以使用dynamic_cast动态类型转换.

其会判断父类是不是指向要转换的目标类型,是的话,就返回这个子类指针,不是的话,会返回空.

在这里插入图片描述

2.基类引用转换为继承类引用

用引用的话,会判断父类是否是引用的要转换的类型,是的话,没有异常,不是的话会抛出bad_cast异常.
在这里插入图片描述

3.dynamic_cast特点

  • 在虚函数中有用
  • 父类到子类的转换中,可判断父类的指向.

4.完整代码

#include <iostream>
using namespace std;

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

class Dog :public Animal
{
public:
	void cry()
	{
		cout << "汪汪汪" << endl;
	}
	void play()
	{
		cout << "汪汪队,汪汪队,打断你的狗腿!" << endl;
	}
};

class Cat :public Animal
{
public:
	void cry()
	{
		cout << "喵喵喵" << endl;
	}
	void play()
	{
		cout << "积极噶,积极噶,蹦蹦吧,蹦蹦吧!" << endl;
	}
};

void play(Animal* animal)
{
	animal->cry();
	Dog* dog = dynamic_cast<Dog*>(animal);
	if (dog)
	{
		dog->play();
	}
	else
	{
		cout << "你个猫!" << endl;
	}

	Cat* cat = dynamic_cast<Cat*>(animal);
	if (cat)
	{
		cat->play();
	}
	else
	{
		cout << "你个狗!" << endl;
	}
}


void play(Animal& animal)
{
	animal.cry();

	try
	{
		Dog& dog = dynamic_cast<Dog&>(animal);
		dog.play();
	}
	catch (bad_cast bc)
	{
		cout << "你个猫!" << endl;
	}


	try
	{
		Cat& cat = dynamic_cast<Cat&>(animal);
		cat.play();
	}
	catch (bad_cast bc)
	{
		cout << "你个狗!" << endl;
	}
}

int main()
{
	Dog* dog=new Dog;
	Cat* cat = new Cat;
	play(dog);
	play(cat);

	Dog dog1;
	Cat cat1;
	play(dog1);
	play(cat1);


	return 0;
}

五.const_cast

1.去除const属性

const的形参本是不能进行修改的,但是可以用const_cast进行去除.
在这里插入图片描述
但是只能对指针和引用有用.
在这里插入图片描述
在常量区的字符串也不能进行去除.
因为指针所指向的内存不能进行修改.
在这里插入图片描述

2.const_cast特点

  • 对指针和引用有用

3.完整代码

#include <iostream>
using namespace std;

void demo(const char* p)
{
	char* p1 = const_cast<char*>(p);
	p1[0] = 'A';
}

void demo(const int a)
{
	int a1 = const_cast<int>(a);
}

int main()
{
	char str[] = "1234567890";
	demo(str);
	cout << str << endl;

	const char* cp= "987654321";//不可以会异常
	demo(cp);

	return 0;
}

六.类型转换怎么使用合适

1.static_cast

  • 隐式转换
  • 基本类型转换
  • 父子类之间的合理转换

2.reinterpret_cast

  • 不同类型之间,进行强制类型转换
  • static_cast不能转换的用这个
  • 但是这个很容易导致数据丢失

3.dynamic_cast

  • 虚基类和子类之间的转换

4.const_cast

  • 去除指针和引用变量的只读属性

5.最后的忠告

当你进行转换时,要知道转换前是什么类型,转换后是什么类型,转换后的结果是什么.

6.c++大牛建议

避免进行类型转换在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2094914.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【网络安全】重置邮件逻辑漏洞导致账户接管

未经许可&#xff0c;不得转载。 文章目录 正文 正文 目标&#xff1a;xxx.com 点击重置密码&#xff0c;系统会发送一封链接至邮箱。响应如下&#xff1a; 从上图中可以看到&#xff0c;validationSession对象中有一个sessionID 而收到的链接中的token和sessionID的值是一样…

总结之Coze 是一站式 AI Bot 开发平台——使用coze(一)

Coze 是什么&#xff1f; Coze 是新一代一站式 AI Bot 开发平台。无论你是否有编程基础&#xff0c;都可以在 Coze 平台上快速搭建基于 AI 模型的各类问答 Bot&#xff0c;从解决简单的问答到处理复杂逻辑的对话。并且&#xff0c;你可以将搭建的 Bot 发布到各类社交平台和通讯…

[Leetcode 51][Hard]-n皇后问题-回溯

目录 一、题目描述 二、整体思路 三、代码 一、题目描述 原题地址 二、整体思路 这种可以算是组合问题的变种&#xff0c;在回溯函数中我们要保存当前已放置皇后的所有位置&#xff0c;同时递归调用时要进行寻找下一个皇后的放置位置。那么我们可以逐行遍历棋盘并作为递归调…

STM32学习记录-10-2-SPI通信(硬件)

1 SPI外设简介 STM32内部集成了硬件SPI收发电路,可以由硬件自动执行时钟生成、数据收发等功能,减轻CPU的负担 可配置8位/16位数据帧、高位先行/低位先行 时钟频率: fPCLK / (2, 4, 8, 16, 32, 64, 128, 256) 支持多主机模型、主或从操作 可精简为半双工/单工通信 支持…

python源码 PBOCMaster MAC的计算函数及计算过程 2des

注意最后一步要用整个key加密 计算过程&#xff1a; MAC&#xff1a; PBOC-MAC DES算法 密钥 长度16(0x10)字节 57 75 20 4D 69 61 6F 6A 75 6E 40 47 26 44 43 11 初始向量 长度8(0x08)字节 00 00 00 00 00 00 00 00 数据 长度74(0x4A)字节 43 48 45 4E 48 41 4F 2D 50 43 7…

如何成为一个飞控算法工程师?

兄弟&#xff0c;这个问题问得好&#xff0c;但也别想着靠看几本书就能一步登天。飞控算法这玩意儿&#xff0c;真要干好了&#xff0c;不是简简单单几个公式几个库就能搞定的。你本科电子专业有点基础&#xff0c;玩过四轴飞行器也算是入门了&#xff0c;但要搞真算法&#xf…

做克隆虚拟机的basic

新建一台虚拟机&#xff08;之前写的有这一步&#xff09; 虚拟机里操作 vi /etc/hostname 改称basic (可改可不改) vi /etc/sysconfig/network-scripts/ifcfg-ens33 TYPEEthernet PROXY_METHODnone BROWSER_ONLYno BOOTPROTOstatic DEFROUTEyes IPV4_FAILURE_FATALno IP…

★ 算法OJ题 ★ 力扣 LCR179 - 和为 s 的两个数字

Ciallo&#xff5e;(∠・ω< )⌒☆ ~ 今天&#xff0c;小诗歌剧将和大家一起做一道双指针算法题--和为 s 的两个数字~ 目录 一 题目 二 算法解析 三 编写算法 一 题目 LCR 179. 查找总价格为目标值的两个商品 - 力扣&#xff08;LeetCode&#xff09; 二 算法解析 …

静态工厂模式(简单工厂模式)与动态工厂模式(工厂方法模式)

1. 简单工厂模式 核心是定义一个创建对象的接口&#xff0c;将对象的创建和本身的业务逻辑分离&#xff0c;降低系统的耦合度&#xff0c;使得两个修改起来相对容易些&#xff0c;当以后实现改变时&#xff0c;只需要修改工厂类即可。该模式对对象创建管理方式最为简单&#x…

list的使用与迭代器的模拟实现

前面学习了string&#xff0c;vector类的使用及模拟&#xff0c;但是它们有一个统一的特点就是底层的内存是连续的&#xff0c;因此迭代器的实现也很简单。现在我们开始学习list类的使用&#xff0c;模拟实现&#xff0c;来看看这个底层内存不是连续的有什么特别之处&#xff0…

2024 SEKAI-CTF(nolibc speedpwn life_simulator_2)

文章目录 nolibcexp speedpwnexp life_simulator_2委托构造函数委托构造函数的语法解释 std:remove和std:erase代码解释原理内存管理注意事项 思路1. 背景2. 示例代码3. 解释 vector插入逻辑1. 函数参数2. 本地变量3. 逻辑分析4. 扩容逻辑5. 直接插入逻辑6. 返回结果 exp nolib…

集成电路学习:什么是FPGA现场可编程门阵列

一、FPGA&#xff1a;现场可编程门阵列 FPGA&#xff0c;全称Field Programmable Gate Array&#xff0c;即现场可编程门阵列&#xff0c;是一种超大规模可编程逻辑器件。它由可编程逻辑资源、可编程互连资源和可编程输入输出资源组成&#xff0c;主要用于实现以状态机为主要特…

【计算机组成原理】七、输入/输出系统:2.I/O接口、I/O控制方式

I/O接口、I/O控制方式 2. I/O接口 文章目录 I/O接口、I/O控制方式2. I/O接口2.1 I/O接口的作用2.2 结构2.3 工作原理2.4 I/O端口2.5 分类 3. I/O控制方式3.1程序查询方式3.2程序中断方式3.2.1中断系统3.2.2工作流程3.2.3多重中断与中断屏蔽技术3.2.4程序中断方式 3.3DMA控制方…

Excel技巧(二)

函数 SUMIFS函数 用于计算其满足多个条件的全部参数的总量 语法&#xff1a;SUMIFS(sum_range, criteria_range1, criteria1, [criteria_range2, criteria2], ...) COUNTIFS函数 计算多个区域中满足给定条件的单元格的个数 语法&#xff1a;countifs(criteria_range1,crit…

【Python报错已解决】`ModuleNotFoundError: No module named ‘graphviz‘`

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引言&#xff1a; 在开发过程中&#xff0c;你是否遇到过尝试导入graphviz模块时遇到了ModuleNotFoundError: No module named …

突发:Runway删库跑路,备受瞩目的Stable Diffusion v1.5不见了!

Runway AI, Inc.创立于2018年&#xff0c;总部位于美国纽约州New York&#xff0c;Runway 是一家应用人工智能研究公司。Runway在谷歌领投的D轮融资中募集到约一亿美元。Runway不仅是投资界的新星&#xff0c;其产品Runway ML参与制作的《瞬息全宇宙》更是斩获了奥斯卡最佳女主…

Mysql基础练习题 1084.销售分析 (力扣)

编写解决方案&#xff0c;报告 2019年春季 才售出的产品。即 仅 在 2019-01-01 &#xff08;含&#xff09;至 2019-03-31 &#xff08;含&#xff09;之间出售的商品 题目链接&#xff1a; https://leetcode.cn/problems/sales-analysis-iii/description/ 建表插入数据&…

【超音速 专利 CN116109587A】一种复杂环境下密封钉焊缝质量检测方法

申请号CN202310066309.X公开号&#xff08;公开&#xff09;CN116109587A申请日2023.01.12申请人&#xff08;公开&#xff09;超音速人工智能科技股份有限公司(833753)发明人&#xff08;公开&#xff09;张俊峰(总); 陈炯标 原文摘要 本发明公开了一种复杂环境下密封钉焊缝…

Javascript常见面试手写题

Javascript常见面试手写题 欢迎Star ⭐️ github 通过自动化脚本&#xff0c;每次push会自动跑单测 100%单测通过,每一个方法都使用jest单元测试进行了验证 后续会持续更新 单测报告 每次push自动生成测试报告 覆盖率单测概览 函数 题目描述1.防抖2.节流5.深浅拷贝6.发…

计算机毕业设计选题推荐-客栈管理系统-酒店预订-民宿管理系统-Java/Python项目实战

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…