实例代码:
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main() {
//一: 隐式类型转换;系统自动进行,不需要程序开发人员介入。
int m = 3 + 45.6;// 48 , 把小数部分截掉,也属于隐式类型转换的一种行为
double n = 3 + 45.6; //48.60000000
//二: 显示类型转换(强制类型转换)
//int k = 5 % 3.2; //语法错
int k = 5 % (int)3.2; // OK C语言风格的强制类型转换
int j = 5 % int(3.2); // OK C语言风格的强制类型转换 (函数风格的强制类型转换)
//C++ 强制类型转换分为4种, 现在写程序应该尽量使用C++风格的强制类型转换
//这4中强制类型转换 分别用于不同的目的,每一个都有不同的名字
//(1) static_cast
//(2) dynamic_cast
//(3) const_cast
//(4) reinterpret_cast
//这四个强制类型转换都被称呼为“命名的强制类型转换”
//通用形式
//强制类型转换名<type>(express);
// 强制类型转换名, 是上边的a,b,c,d四个名字之一
// type: 转换的目标类型
// express: 要转换的值
//(5) static_cast : 静态转换,大家就理解成“正常转换”,编译的时候就会进行类型转换的检查。
//代码中要保证转换的安全性和正确性, static_cast 含义跟c 语言中的强制类型转换这种感觉差不多
//C风格的强制类型转换,以及编译器能够进行的隐式类型转换,都可以用static_cast 类显示完成
//a> 相关类型转换,比如整形和实型之间的转换
double f = 100.34f;
int i = (int)f; //C风格的
int i2 = static_cast<int>(f); //C++风格的类型转换
//b> 后续学习类的时候子类转成父类(继承关系),也可以用这个static_cast转
class A {};
class B : public A {};
B b;
A a = static_cast<A>(b); //把子类转成父类的对象
//c> void* 与其他类型指针之间的转换, void* :无类型指针(可以指向任何指针类型)
int i1 = 10;
int *p = &i1;
void *q = static_cast<void*>(p); //int* 转成void*
int* db = static_cast<int*>(q);
// 一般不能用于指针类型之间的转换比如 int* 转double*, float*转double*等。
//(6) dynamic_cast:主要应用于 运行时类型识别和检查,主要用在父类和子类之间转换
//(7) const_cast :去除指针或者引用的const属性。该转换能够将const性质转换掉
// 编译时就会进行类型转换
const int ai = 90;
//int ai2 = const_cast<int>(ai); //ai不是指针也不是引用不能转
const int *pai = &ai;
int *pai2 = const_cast<int*>(pai);//语法正确
//*pai2 = 120;// 这种写值行为,是属于一种未定义行为(不确定行为),大家不要这么干
//(8) reinterpret_cast: 编译的时候就会进行类型转换的检查
//reinterpret : 重新解释。(将操作数内容解释为另一种不同的类型【能把操作数的类型都转了】)
//处理无关类型的转换,也就是两个转换类型之间没有什么关系,就等于可以乱转,自由转
//常用于如下两种转换:
//(a)将一个整形(地址)转换成指针,一种类型指针转换成另一个类型指针,按照转换后的内容重新解释内存中的内容
//(b)也可以从一个指针类型转换成一个整形。
int i3 = 10;
int *pi = &i3;
int *p2 = reinterpret_cast<int*>(&i3);
//总结:
//(1) 强制类型转换,不建议使用,强制类型转换能够抑制编译器报错。
//(2) 资料说:reinterpret_cast 危险(合乎规则用就好), 使用const_cast 意味着设计缺陷
//(3) 如果实在需要使用类型转换,不要再使用C语言风格的类型转换了,而用C++风格的类型转换
system("pause");
return 0;
}