C++四种cast 类型转换方式

目录

const_cast:

static_cast:

reinterpret_cast:

dynamic_cast:

implicit_cast:


const_cast : 去掉(指针或者引用)常量属性的一个类型转换
static_cast : 提供编译器认为安全的类型转换(没有任何联系的类型之间的转换就被否定了,就编译不通过)
reinterpret_cast : 类似于C风格的强制类型转换,谈不上什么安全
dynamic_cast : 主要用在继承结构中,可以支持RTTI类型识别的上下转换

const_cast:

        const_cast<这里面必须是指针或者引用类型  int* int&>

        const_cast在进行类型强转的时候,地址a的类型是和左边的类型和<>里面的去掉常量的类型是要保持一致的(在这里就是只能转换为int*类型

double *p1 = const_cast<int*>(&a);   //erro
int *p1 = const_cast<int*>(&a);   //accept

static_cast:

提供编译器认为安全的类型转换(没有任何联系的类型之间的转换就被否定了,就编译不通过)

 基本上可以实现全部类型的转换,并不能实现全部的,需要使用者自己确定。

static_cast可以在基类和派生类之间使用

  • 因为基类类型和派生类类型是继承结构上从上到下的类型。
  • 类型强转的时候,它们类型之间是有关系联系的。
  • static_cast可以通过它们之间的互相转换,但是转换之后,代码到底安不安全是由开发者来保证,而不是由static_cast保证。

reinterpret_cast:

就是随意转了,没有任何安全可言

dynamic_cast:

主要用在继承结构中,可以支持RTTI类型识别的上下转换

#include <iostream>
using namespace std;


class Base//抽象类 
{
public:
	virtual void func() = 0;
};
class Derive1 : public Base
{
public:
	void func() { cout << "call Derive1::func" << endl; }
};
class Derive2 : public Base
{
public:
	void func() { cout << "call Derive2::func" << endl; }
	//Derive2实现新功能的API接口函数
	void derive02func()
	{
		cout << "call Derive2::derive02func" << endl;
	}
};
/*
typeid(*p).name() == "Derive"
*/
void showFunc(Base* p)
{
	//dynamic_cast会检查p指针是否指向的是一个Derive2类型的对象?
	//通过p访问->vfptr访问->vftable RTTI信息 如果是,dynamic_cast转换类型成功,
	//返回Derive2对象的地址,给pd2;否则返回nullptr
	//static_cast是编译时期的类型转换  dynamic_cast是运行时期的类型转换,是支持RTTI信息识别的
	Derive2* pd2 = dynamic_cast<Derive2*>(p);
	if (pd2 != nullptr)
	{
		pd2->derive02func();
	}
	else
	{
		p->func();//动态绑定  *p的类型 Derive2  derive02func
	}
}
int main()
{
	Derive1 d1;
	Derive2 d2;
	showFunc(&d1);
	showFunc(&d2);

	return 0;
}

        这里使用 dynamic_cast 进行转换是为了进行运行时类型检查。如果 p 指针指向的实际对象的类型是派生类 Derive2 或其派生类,那么转换将成功,pd2 将指向有效的对象。否则,如果类型不匹配,转换将返回空指针(nullptr)

        这里使用一个dynamic_cast转换,执行过程中程序会优先尝试将传入的基类指针转化为Derive2类型的,如果传入的p是 Derive2 则转换成功,可以使用这个指针去调用基类函数,执行不同的函数获得不同的结果。

implicit_cast:

并不是 C++ 标准库中的函数或类型,而是一种编程技巧,通常用于进行隐式类型转换,类似于 C++ 中的强制类型转换。

template <typename To, typename From>
inline To implicit_cast(From const &f) {
  return f;
}

在这个定义中,implicit_cast 接受一个源类型 From 的常引用,并将其隐式地转换为目标类型 To。实际上,这个函数不会进行任何实际的转换操作,只是通过返回源类型的引用/值,让编译器根据类型的兼容性进行隐式转换。

通常情况下,implicit_cast 用于在不进行明确类型转换的情况下,进行编译器认可的类型转换,从而减少代码中显式类型转换的使用。这有助于提高代码的可读性和安全性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值