当前位置: 首页 > article >正文

C++(4个类型转换)

1. C语言中的类型转换
1. 隐式 类型转换: 具有相近的类型才能进行互相转换,如:int,char,double都表示数值。
2. 强制类型转换:能隐式类型转换就能强制类型转换,隐式类型之间的转换类型强相关,强制类型转换之间类型关联没有那么大,如:整形和指针,指针与指针。

int main()
{
	int a = 0;

	// 隐身类型转换
	char b = a;
	int c = b + a;

	// 强制类型转换
	double* d = (double*)a;
		
	double* p = new double;
	int* h = (int*)p;

	return 0;
}

3.缺点:转换的可视性比较差,所有的转换形式都是一样的,不好排查错误。  

2. C++支持的类型转换

1. 兼容C语言的所有转换。

2. 支持内置类型转自定义类型,如:单/多参数的构造函数支持隐式类型转换。

3. 支持自定义类型转内置类型,

4. 支持自定义类型转自定义类型

class A
{
public:
	A() {}
	A(int i) {}
	// explicit 可以不让隐式类型转换
	// explicit A(int i, int j) {}
	A(int i, int j) {}
	
	// 自定义类型转内置类型
	operator int()
	{
		_code = 10;
		return _code;
	}

	int _code;
};

class B
{
public:
	B(const A& a) {}

};
int main()
{
	// C++98 单参数构造
	A a1 = 1;
	// C++11 多参数构造
	A a2 = { 1,2 };
	// 自定义类型转内置类型
	int k = (int)a1;
	// 自定义类型转自定义类型
	B b = a1;
	return 0;
}
3. C++4种强制类型转换(标准C++为了加强类型转换的可视性,引入了四种命名的强制类型转换操作符)

1. static_cast(隐式类型转换)

2. reinterpret_cast(强制类型转换)

int main()
{
	int a = 0;

	// 隐身类型转换
	char b = static_cast<int>(a);
	int c = static_cast<int>(b) + a;

	// 强制类型转换 
	double* d = reinterpret_cast<double*>(a);
		
	double* p = new double;
	int* h = reinterpret_cast<int*>(p);

	return 0;
}

3. const_cast(删除变量的const属性)

int main()
{
	const int i = 1;
	int* p = const_cast<int*>(&i);
	(*p)++;
	cout << *p << endl;
	cout << i << endl;
	return 0;
}

虽然 i 是const修饰的,但i本身还是在栈区,只是属性是const(常变量),可以用强制转换成指针

但打印出来的结果不对劲,因为被const修饰了,编译器默认他不会修改,直接放到寄存器里,下次取数据直接拿寄存器里面的,不会到内存里拿。

加上volatile关键字让编译器去内存里取数据

4. dynamic_cast(用于将一个父类对象的指针/引用转换为子类对象的指针或引用(动态转换))

1. 只能用于父类含有虚函数的类。
2. 会先检查是否能转换成功,能成功则转换,不能则返回 0。
dynamic_cast 则会检查能否转换成功,指向子类成功,指向父类失败

http://www.kler.cn/a/419928.html

相关文章:

  • 瑞芯微方案主板Linux修改系统串口波特率教程,触觉智能RK3562开发板演示
  • 如何把阿里云ECS里的文件下载到本地(免登录免配置)
  • ARP表、MAC表、路由表的区别和各自作用
  • 嵌入式硬件实战提升篇(三)商用量产电源设计方案 三路电源输入设计 电源管理 多输入供电自动管理 DCDC降压
  • Nginx学习-安装以及基本的使用
  • BA是什么?
  • Elasticsearch 进阶
  • UIE与ERNIE-Layout:智能视频问答任务初探
  • 【前端】安装hadoop后,前端启动报错,yarn命令
  • 鸿蒙开发-HMS Kit能力集(地图服务、华为支付服务)
  • 12.2作业
  • JavaWeb开发
  • Git Rebase vs Merge:操作实例详解
  • 五、使用 Javassist 实现 Java 字节码增强
  • WebRTC音视频同步原理与实现详解(下)
  • VLC 播放的音视频数据处理流水线搭建
  • vim插件管理器vim-plug替代vim-bundle
  • 腾讯rapidJson使用例子
  • 我与Linux的爱恋:共享内存
  • 【新人系列】Python 入门(十五):异常类型
  • Java 8 Stream API 入门教程:轻松使用 map、filter 和 collect 进行数据处理
  • PyCharm中Python项目打包并运行到服务器的简明指南
  • SpringBoot3 + Vue3 由浅入深的交互 基础交互教学2
  • 数据库管理-第267期 23ai:Oracle Data Redaction演示(20241128)
  • CSS学习记录03
  • NLP 的发展历程