C++ 类型转换

Hello!!大家早上中午晚上好!!今天来复习C++的类型转换部分内容!!

一、C语言的类型转换

1.1什么时候发生类型转换?

当赋值运算符左右两个类型不一样的时候,当形参与实参类型不匹配的时候,当返回类型和接收返回类型不匹配的时候就需要发生类型转换。

1.2类型转换的种类

第一种隐式类型转换:编译器在编译阶段完成,能转就转不能转就报错;

第二种显式类型转换:需要用户自己完成;

代码示例:

cpp 复制代码
int main()
{
	//隐式类型转换
	int a = 10;
	double b = a;

	int* p = &a;

	//显式类型转换(强制类型转换)
	int adress = (int)p;
	return 0;
}
1.3C语言类型转换的缺陷

①隐式类型转换可能会存在数据精度丢失问题;

②显式类型转换把所有情况混合在一起,代码不够清晰;

二、C++的类型转换

2.1C++为了加强转换类型的可视性,引入了4中强制类型转换操作符:

static_cast、reinterpret_cast、const_cast、dynamin_cast

2.2static_cast

static_cast是静态类型转换,编译器支持的所有隐式类型转换都可以用。注意的是:static_cast不能用于两个互不相干的类型之间的转换;

使用:

cpp 复制代码
int main()
{
	double a = 33.56;
	int b = static_cast<int> (a);
	cout << b << endl;
	return 0;
}
2.3reinterpret_cast

reinterpret_cast用于两个不同类型之间的转换;

使用:

cpp 复制代码
int main()
{
	int a = 10;
	//int* p = static_cast<int*>(a);  报错
	int* p = reinterpret_cast<int*>(a);
	return 0;
}

注意:这里使用static_cast转换会报错:

2.3const_cast

const_cast 最常用的用途就是删除变量的const属性,方便赋值;

使用:

cpp 复制代码
int main()
{
	const int i = 10;
	int* p = const_cast<int*>(&i);
	*p = 13;
	cout << *p << endl; //13
    //cout<<i<<endl;  //10
	return 0;
}

这里需要注意的是,如果你访问i它显示的依然是10;

2.4dynamic_cast

dynamic_cast用于把父类指针/引用转换为子类指针/引用

向上转换:子类指针/引用转换为父类指针/引用;(赋值兼容)

向下转换:父类指针/引用转换为子类指针/引用;(dynamic_cast转型是安全的!)

注意:

①、dynamic_cast只能将含有虚函数的父类指针/引用转换为子类的指针/引用!

②、dynamic_cast转换是会先检查能否成功转换,如不能返回0;

(只有父类指针指向子类时并且父类含有虚函数才会转换成功!!否则都返回0!!)

代码示例:

cpp 复制代码
class A
{
public:
	virtual void print()
	{
		cout << "父类含有虚函数" << endl;
	}
};
class B :public A
{

};
 
int main()
{
	A a1;
	B b1;
	A* pa1 = &a1;//父类指针指向父类
	A* pa2 = &b1;//父类指针指向子类
	B* pb1 = dynamic_cast<B*>(pa1);//转换失败返回0
	B* pb2 = dynamic_cast<B*>(pa2);//转换成功
	cout << pb1 << endl;
	cout << pb2 << endl;
	return 0;
}

当父类没有虚函数时:

代码修改:

cpp 复制代码
class A
{
public:
	void print()
	{
		cout << "父类不含有虚函数" << endl;
	}
};

编译报错:

2.5总结

注意 强制类型转换关闭或挂起了正常的类型检查,每次使用强制类型转换前,程序员应该仔细考虑是 否还有其他不同的方法达到同一目的,如果R非强制类型转换不可,则应限制强制转换值的作用 域,以减少发生错误的机会。强烈建议:避免使用强制类型转换!

三、RTTI(了解)

**3.1、**RTTI:Run-time Type identification的简称,即:运行时类型识别。
3.2、C++通过以下方式支持RTTI

①. typeid运算符

②. dynamic_cast运算符

③. decltype

好了,今天就到这里,如果您觉得有所收获记得点赞收藏+关注哦!!谢谢!!!

咱下期见!!!

相关推荐
用户3126874877201 分钟前
Spring 事件机制到底怎么传播的?ApplicationEvent 源码拆解
java·spring
软件资深者3 分钟前
Windows10、11轻松设置 使用教程:把Windows繁杂的设置集成到一个面板,关广告/关更新/调隐私全搞定,系统设置工具新手 5 分钟上手(2026)
windows
默辨13 分钟前
Spring AI Alibaba 核心知识点
java·ai·spring ai·spring alibaba
乐观的Terry22 分钟前
10、发布系统-路由管理与灰度发布
java
啦啦啦啦啦zzzz26 分钟前
设计模式:原型模式
c++·设计模式·原型模式
唐青枫31 分钟前
Java WebLogic 实战指南:从 Domain、数据源到 WAR 部署和集群管理
java
Yolanda_202236 分钟前
Python学习-第九部分-错误处理与异常处理
开发语言·python·学习
郝学胜-神的一滴38 分钟前
Qt 高级编程 037:QSS按钮样式封神指南
开发语言·c++·qt·软件工程·用户界面
DFT计算杂谈40 分钟前
SCIENTIFIC REPORTS 非 van der Waals可调二维磁性材料设计平台
开发语言·php
库拉库拉里1 小时前
深入理解 C# 异步编程:同步、Task.Wait () 与 await 的本质区别及实践指南
开发语言·c#