C++的四种类型转换

C++的四种类型转换

1. const_cast

	const int* pConstNum = #
	int* pNum = const_cast<int*>(pConstNum);
	cout << *pNum; //1
	*pNum = 4;
	cout << *pNum;//4

从上面代码可以看到,我们实现了修改一个常量指针的内容(常量指针就是一个指向常量的指针,内容不能修改,可以修改指向)

const_cast的作用就是将常量指针转换为普通的指针

2. static_cast

	//基础数据类型之间的转换
	int a = 65;
	char ch = static_cast<char>(a);
	cout << ch;//A
	//父类和子类之间的转换,子类转父类是安全的,父类转子类是不安全的
	//自行脑补代码

类似与C语言的强制类型转换,可以用在基础数据类型之间的转换父类和子类之间的转换 父类指针和子类指针之间的转换最好使用dynamic_cast.

3. dynamic_cast

	Base* pb = new Sub();
	Sub* ps1 = static_cast<Sub*>(pb);  //子类->父类,静态类型转换,正确但不推荐
	Sub* ps2 = dynamic_cast<Sub*>(pb); //子类->父类,动态类型转换,正确

	Base* pb2 = new Base();
	Sub* ps21 = static_cast<Sub*>(pb2); //父类->子类,静态类型转换,危险!访问子类_name成员越界
	Sub* ps22 = dynamic_cast<Sub*>(pb2);//父类->子类,动态类型转换,安全,但结果为NULL
   

用于含有虚函数的基类指针和子类指针之间的转换

#include "stdafx.h"
#include<iostream>
#include <math.h>
#include <algorithm>
using namespace std;

class A
{
public:
	int a = 1;
	virtual void f()
	{

	}
};

class B:public A
{
public:
	int b = 2;
};

int _tmain(int argc, _TCHAR* argv[])
{
	A*pA = new A();
	B*pB = new B();
	B* ppB = static_cast<B*>(pA);
	cout<<ppB->b; //ppB不安全,访问到了不能访问的地址
	B* pppB = dynamic_cast<B*>(pA); //如果A类没虚函数,这里pA会报错
	cout << pppB->b; //pppB为空指针
	return 0;
}



4.reinterpret_cast

重新解释,几乎什么都能转,但是可能会出问题。 例如,将int转完int*,然后再转回int,值没有发生变化。

全部评论

相关推荐

整顿职场的柯基很威猛:这种不可怕,最可怕的是夹在一帮名校里的二本选手,人家才是最稳的。
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务