C++语法学习笔记八: 类型转换

实例代码:


#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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值