IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 【C++】:静态转换(static_cast)与动态类型转换(dynamic_cast) -> 正文阅读

[C++知识库]【C++】:静态转换(static_cast)与动态类型转换(dynamic_cast)

大家好,我是翼同学!

1??前言

这篇笔记的内容是:静态类型转换与动态类型转换

在之前我们学过,变量的数据类型可以强制转换为其他数据类型。但由于这种C风格的类型转换可能会出现一些问题,即过于松散的情况,因此C++提出了更加规范、严格的类型转换,添加了四个类型转换运算符,进而更好的控制类型转换过程。

类型转换符:

  • static_cast
  • dynamic_cast
  • const_cast
  • reinterpret_cast

因此,我们可以根据自身的目的选择合适的运算符,进行类型转换,也能让编译器能检查程序的行为是否和正常的逻辑相吻合。


2??静态转换(static_cast)

?用法

静态转换可以用两种用法:

一是基本数据类型的转换(如将int类型转换为char类型)

二是静态转换用于类层次结构中父类和子类之间指针或引用的转换。(有继承关系的)

需要注意,这里有两个概念需要理清楚:

  • 上行转换:将子类的指针或引用转换成父类表示,这是安全可行的。
  • 下行转换:但是将父类的指针或引用转换成子类表示时,就是不安全的(如果没有动态类型检查的话)

??语法

static_cast <要转换的类型>(变量名或表达式)

🌱例子

一、基本数据类型转换的例子

#include <iostream>
using namespace std;
int main()
{
	int test = 97;
	
	char ch = static_cast <char> (test);
	
	cout<<"ch的值为"<<ch;
	
	return 0;
}

运行结果如下:

在这里插入图片描述

二、类层次结构中的类型转换

  • 这里就举例类继承中指针的互转
#include <iostream>
using namespace std;
//基类 
class Base{

};
//派生类 
class Derive : public Base{
};
//其他类   
class Other{
};
int main()
{ 
	Base* a = 0;
	
	Derive* a1 = 0;
	
	Other* a2 = 0;
	
	Base* test1 = static_cast<Base*>(a1); //将派生类对象的类型转换为基类 
	
	//Base* test2 = static_cast<Base*>(a2);//错误的示范,必须有继承关系才能进行类型转换 
	
	return 0;
}

3??动态转换(dynamic_cast)

?用法

前面讲过,利用static_cast进行静态类型转换时,可以用于类层次结构中父类和子类之间指针或引用的转换。而dynamic_caststatic_cast的语法基本相同。
而使用dynamic_cast的好处在于,当想要将父类的指针或引用转换成子类表示时,dynamic_cast具有类型检查的功能,这使其比static_cast更加安全。

因此,总的来说,动态类型转换dynamic_cast经常使用在多态场景下,基类和派生类的相互转换,并且比static_cast更为安全。并且,动态转换不支持基本数据类型转换,必须是指向完整的类类型的指针或引用。而且我们可以通过判断转换后的指针值是否为NULL判断是否转换成功。

??语法

dynamic_cast<要转换的类型>(变量名或表达式)

🌱例子

#include <iostream>
using namespace std;
//基类 
class Base{
	virtual void printf();
};
//派生类 
class Derive : public Base{
	void printf(){
		cout<<"hello"<<endl; 
	}
};
int main()
{ 
	Base* a = 0;
	Derive* a1 = 0;
	
	// 将派生类的指针转换为基类的指针(安全的) 
	Base* test1 = dynamic_cast<Base*>(a1); 
	
	// 将基类的指针转换为派生类的指针(不安全的,如果产生了多态,则可以向下转换)
	Derive* test2 = dynamic_cast<Derive*>(a);  
	
	return 0;
}

4??写在最后

好了,本篇笔记就到写这,欢迎大家到评论区一起讨论!

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-07-04 22:37:15  更:2022-07-04 22:39:09 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/12 13:09:03-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码