类型转换(C++)

发布时间:2023年12月19日

1.5 类型转换

类型转换分为隐式转换显示转换

写C/C++代码的时候,有时候不可避免的会使用类型转换,良好的代码风格中应该避免隐式转换,隐式转换有时候会产生不易察觉的问题。

1.5.1 隐式类型转换

C++定义了一套标准数据类型转换的规则,在必要时C++会用这套规则进行数据类型的转换。这种转换是在程序员不参与的情况下自动进行的,所以为隐式类型转换。转换原则:
在这里插入图片描述

一下四种常见类型会发生隐式转换:

  • 多种数据类型的算术表达式中

    int a = 2;
    float b = 3.14;
    double c = 6.5;
    a+b+c;
    
  • 将一种数据类型赋值给另一种数据类型变量

    int a = 2;
    float b = 3.14;
    long double c = 6.5;
    b = a;
    c = a;
    
  • 函数调用时,若实参表达式与形参的类型不相符

    int min(int a, int b) {
        return a > b ? a : b;
    }
    int a = 3;
    float b = 3.3;
    int x = min(b, a + 3.6);
    
  • 函数返回时,如果返回表达式的值与函数返回类型不同

    double add(int a, int b) {
        return a + b;
    }
    

1.5.2 显示类型转换

显示类型转换也称为强制类型转换,是指把一种数据类型强制转换成另一种数据类型。

int a = 4;
float c = (float) a;//C风格 C++也支持
float d = float(a);//C++风格 C不支持

C++提供了更严格的类型转换,可以提供更好的控制转换过程,C++增加了四个强制转换运算符:

static_cast,dynamic_cast,const_cast和reinterpret_cast.

  • 静态类型转换 static_cast

    • 目标类型变量 = static_cast<目标类型> (源类型变量)
    • 用于隐式转换的逆转换,常用于基本类型之间的转换,void* 转换为其它类型的指针
    • 不能用于整型和指针之间的互相转换,不能用于不同类型的指针、引用之间的转换(风险高)
    #include <iostream>
    #include <cstdlib>
    using namespace std;
    
    int main(void) {
    
    	int a = 100;
    	double a1 = (double)a;//c风格
    	double a2 = double(a);//c++风格
    
    	double b = static_cast<double>(a);
    	
    	void *p = malloc(100);
    	int *pi = static_cast<int *> (p);
    	char *pc = static_cast<char *> (p);
    
    //    int num = p; //如果从C的角度来看(或搞底层开发的人员来看)我们眼里只有内存,没有什么数据类型,在32位的机器上num变量占4字节,p指针也是对应4字节内存,严格来说这是没问题的,就是把p指针4字节内存搬到num变量4字节内存中了,数据又没有丢,但是在C++中直接这样写是编译不通过的(C++比较严格)。
    	//int num = static_cast<int>(p); // error 整型和指针之间
    	//pc = static_cast<char *>(pi); // error 不同类型的指针
    	return 0;
    }
    
    • 用于自定义类型的转换(向上造型)
  • 重解释类型转换 reinterpret_cast

    • 目标类型变量 = reinterpret_cast<目标类型> (源类型变量)
    • 用于任意类型指针或引用之间的转换
    • 指针和整型数之间的转换
    #include <iostream>
    #include <cstdlib>
    using namespace std;
    
    int main(void) {
    
    	void *p = malloc(100);
    	int *pi = static_cast<int *> (p);
    	char *pc = static_cast<char *> (p);
    
    	//int num = static_cast<int>(p); // error
    	//pc = static_cast<char *>(pi); // error
    	
    	int num = reinterpret_cast<int>(p);
    	pc = reinterpret_cast<char *>(pi);
    
    	int n = 0x00414243;
    	
    	char *ps = reinterpret_cast<char *>(&n);
    	cout << ps << endl; //CBA
        cout << hex << n << endl; //414243
    	return 0;
    }
    
  • 常类型转换 const_cast

    • 目标类型变量 = const_cast<目标类型> (源类型变量)
    • 用于去除指针或引用的常属性
    #include <iostream>
    using namespace std;
    
    int main (void) {
    
    	int num = 2;
    	const int *p1 = &num;
    	// (*p1)++; // error
    
    	int *p2 = const_cast<int *>(p1);
    	*p2 = 100;
    
    	cout << num << endl;
    	return 0;
    }
    
  • 动态类型转换 dynamic_cast

    • 目标类型变量 = dynamic_cast<目标类型> (源类型变量)
    • 主要用于多态中类指针的向下转型,可以检测是否可以转型成功
    
    
文章来源:https://blog.csdn.net/qq_36091214/article/details/135093322
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。