定义:
一些操作符要求其操作数具有特定的类型,或者具有相同的类型,此时可能产生类型转换
隐式类型转换:
自动发生、实际上是一个(有限长度的)转型序列
我们在进行一些运算操作时,编译器会进行自动的类型转换:
#include <iostream>
int main()
{
auto b = 3 + 0.5;
}
这里的auto会进行类型推导,0.5 是double类型变量,3是int类型变量,此时发生类型转换,变为double类型,与0.5相加
利用C++ insights 验证一下:
显示类型转换:
顾名思义是显示引入的类型转换
static_cast:在编译期完成转换,性能更好,但安全性较差,会发生一些意外
#include <iostream>
int main()
{
int a = 3;
int b = 4;
std::cout << static_cast<double>(a) / b << std::endl;
} //a:int --> double
Output:
0.75
但static_cast不可以去除常量性:
#include <iostream>
int main()
{
const int* ptr;
static_cast<int*> (ptr);
}
Output:
error: invalid 'static_cast' from type 'const int*' to type 'int*'
const_cast:改变常量性,但这对变量来说的,如果是常量,会有可能发生一些意外,行为是不确定的
#include <iostream>
int main()
{
int x = 4;
const int& ref = x;
int& ref2 = const_cast<int&> (ref);
ref2 = 5;
std::cout << x << std::endl;
}
Output:
5
reinterpret_cast: 一般用于指针类型转换,强制按照转换后的类型去解释,因此会造成一些不确定的情况发生
#include <iostream>
int main()
{
int x = 5;
int* ptr = &x;
double* ptr2 = reinterpret_cast<double*> (ptr);
std::cout << *ptr2 << std::endl;
运行该段代码,输出的结果每一次都不同,因为int类型占四个字节,而double类型占八个字节,显然会出现不确定的情况
#include <iostream>
int main()
{
int x = 5;
int* ptr = &x;
float* ptr2 = reinterpret_cast<float*> (ptr);
std::cout << *ptr2 << std::endl;
}
这里int 和 float 所占字节数相同,每次运行结果都是一样的:
Output:
7.00649e-45
C 形式的类型转换:在C++不建议使用
(double) 3;