• 【C++】:静态转换(static_cast)与动态类型转换(dynamic_cast)


    大家好,我是翼同学!

    1️⃣前言

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

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

    类型转换符:

    • static_cast
    • dynamic_cast
    • const_cast
    • reinterpret_cast

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


    2️⃣静态转换(static_cast)

    ✨用法

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

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

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

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

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

    ✔️语法

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

    🌱例子

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

    #include <iostream>
    using namespace std;
    int main()
    {
    	int test = 97;
    	
    	char ch = static_cast <char> (test);
    	
    	cout<<"ch的值为"<<ch;
    	
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    运行结果如下:

    在这里插入图片描述

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

    • 这里就举例类继承中指针的互转
    #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;
    }
    
    • 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

    3️⃣动态转换(dynamic_cast)

    ✨用法

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

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

    ✔️语法

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

    🌱例子

    #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;
    }
    
    • 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

    4️⃣写在最后

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

  • 相关阅读:
    【ACM】简单题(4)
    Java 中Maven 和 ANT
    解读视联网发展阶段之成年篇
    [vue] 数据不响应 ... Vue.set
    区块链架构-fabric集群版安装(centos7版本)
    重入锁和读写锁
    JavaScript 67 JavaScript HTML DOM 67.7 JavaScript HTML DOM - 改变 CSS
    VScode为什么选择了Electron,而不是QT?
    浅谈Linux系统信息与资源
    进程间的通信方式简介
  • 原文地址:https://blog.csdn.net/m0_62999278/article/details/125392399