类型转换分为隐式转换和显示转换
写C/C++代码的时候,有时候不可避免的会使用类型转换,良好的代码风格中应该避免隐式转换,隐式转换有时候会产生不易察觉的问题。
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;
}
显示类型转换也称为强制类型转换,是指把一种数据类型强制转换成另一种数据类型。
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
#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
#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
#include <iostream>
using namespace std;
int main (void) {
int num = 2;
const int *p1 = #
// (*p1)++; // error
int *p2 = const_cast<int *>(p1);
*p2 = 100;
cout << num << endl;
return 0;
}
动态类型转换 dynamic_cast