c++四种强制类型转换

看了一部分关于强制类型的转换,感觉讲的比较零散,做下关键信息汇总:

一、C风格的类型转换:

C风格的强制转换风格如下:

TypeName b = (TypeName)a;

完全靠程序员的经验对程序的结果负责。

二、C++风格的强制类型转换函数

1、const_cast

这个转换函数,可以去掉const变量的const属性,关键是:有什么用!

#include<iostream>
using namespace std;
int func(int& a,int& b)
{
	a = 1;
	b = 2;
	return a;
}

int main()
{
	const int i = 20;
	const int j = 30;
	int & testi = const_cast<int&>(i);
	int & testj = const_cast<int&>(j);
	
	int  max = func(testi, testj);

	cout << "i:["<<i<<"],test:["<<testi<<"],&i:["<<&i<<"],&test:["<<&testi<<"],max:"<<max << endl;
	cin.get();

	return 0;
}

运行结果为:

i:[20],test:[1],&i:[010FFD04],&test:[010FFD04],max:1

func函数不能接受i、j参数,编译阶段即会报错。但是testi、testj由于本身类型是int,可以作为参数。

testj、testj的修改并不会影响i、j的值,这是区别于常规引用的地方。

因此我比较赞同有个人说的:“所以,const_cast的目的并不是为了让你去修改一个本身被定义为const的值,因为这样做的后果是无法预期的。const_cast的目的是修改一些指针/引用的权限,如果我们原本无法通过这些指针/引用修改某块内存的值,现在你可以了。”

2、static_cast

强制类型转换,作用:

a、隐形的基本类型转换

b、派生类转换为基类(上行、安全),基类转换为派生类(下行,不安全)

3、dynamic_cast

#include<iostream>
using namespace std;

class  A {
public: 
	virtual void show()
	{
		cout << "A" << endl;
	}
};
class B : public A {
public:
	virtual void show()
	{
		cout << "B" << endl;
	}
};
class C : public B {
public:
	virtual void show()
	{
		cout << "C" << endl;
	}
};
int main()
{
	A a;
	B b;
	C c;
	C* p = static_cast<C*>(&a);//p->show()输出A
	//C* p = dynamic_cast<C*>(&a);//p为空指针
	//A* p = dynamic_cast<A*>(&c);//p->show()输出C
	//C* p = reinterpret_cast<C*>(&a);//p->show()输出A
	if (NULL == p)
	{
		cout << "error" << endl;
		cin.get();
		return -1;
	}
	p->show();

	cin.get();
	return 0;
}

dynamic_cast对于基类的指针转换为派生类的指针的场景,会返回空指针。对于基类引用转换为派生类引用的场景,会抛出std::bac_cast异常。可在RTTI场景下保证程序类型转换的安全性。

4、reinterpret_cast

基于内存位的类型转换,强制转换,不计后果,一定能够编译通过。安全性全靠程序员自己检查。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值