定义:

一些操作符要求其操作数具有特定的类型,或者具有相同的类型,此时可能产生类型转换

隐式类型转换:

自动发生、实际上是一个(有限长度的)转型序列
我们在进行一些运算操作时,编译器会进行自动的类型转换:

  1. #include <iostream>
  2. int main()
  3. {
  4. auto b = 3 + 0.5;
  5. }

这里的auto会进行类型推导,0.5 是double类型变量,3是int类型变量,此时发生类型转换,变为double类型,与0.5相加
利用C++ insights 验证一下:
image.png

显示类型转换:

顾名思义是显示引入的类型转换

static_cast:在编译期完成转换,性能更好,但安全性较差,会发生一些意外

  1. #include <iostream>
  2. int main()
  3. {
  4. int a = 3;
  5. int b = 4;
  6. std::cout << static_cast<double>(a) / b << std::endl;
  7. } //a:int --> double

Output:

  1. 0.75

但static_cast不可以去除常量性:

  1. #include <iostream>
  2. int main()
  3. {
  4. const int* ptr;
  5. static_cast<int*> (ptr);
  6. }

Output:

  1. error: invalid 'static_cast' from type 'const int*' to type 'int*'

const_cast:改变常量性,但这对变量来说的,如果是常量,会有可能发生一些意外,行为是不确定的

  1. #include <iostream>
  2. int main()
  3. {
  4. int x = 4;
  5. const int& ref = x;
  6. int& ref2 = const_cast<int&> (ref);
  7. ref2 = 5;
  8. std::cout << x << std::endl;
  9. }

Output:

  1. 5

reinterpret_cast: 一般用于指针类型转换,强制按照转换后的类型去解释,因此会造成一些不确定的情况发生

  1. #include <iostream>
  2. int main()
  3. {
  4. int x = 5;
  5. int* ptr = &x;
  6. double* ptr2 = reinterpret_cast<double*> (ptr);
  7. std::cout << *ptr2 << std::endl;

运行该段代码,输出的结果每一次都不同,因为int类型占四个字节,而double类型占八个字节,显然会出现不确定的情况

  1. #include <iostream>
  2. int main()
  3. {
  4. int x = 5;
  5. int* ptr = &x;
  6. float* ptr2 = reinterpret_cast<float*> (ptr);
  7. std::cout << *ptr2 << std::endl;
  8. }

这里int 和 float 所占字节数相同,每次运行结果都是一样的:
Output:

  1. 7.00649e-45

C 形式的类型转换:在C++不建议使用

  1. (double) 3;