相关文章推荐
胡子拉碴的椰子  ·  在 TypeScript ...·  1 年前    · 
低调的枇杷  ·  RestTemplate ...·  1 年前    · 

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;
    

    运行结果如下:

    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️⃣写在最后

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

    分类:
    后端
    标签: