欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

c++中的四种类型转换

程序员文章站 2022-07-02 15:26:56
...

左值:对象的身份(内存中的位置
右值:对象的值(内容

dynamic_cast

安全向下转型<唯一一个无法由旧式语法执行的动作>

dynamic_cast<type*>(e);//e必须是有效的指针(不能是NULL)
dynamic_cast<type&>(e);//e必须是左值
dynamic_cast<type&&>(e);//e不能是左值

将基类的指针或引用安全的转换成派生类的指针或引用

type表示目标类型

当e是目标类型对象或者是其派生类对象时不会出错,其他情况会失败,如果是指针,会返回0,引用会抛出bad_cast异常

作用:无法为基类增加虚函数,就可以使用dynamic_cast代替虚函数

#include <iostream>
#include <string>
using namespace std;
class a 
{
};
class b :public a
{};
int main()
{
	a p1;
	b p2;
	p1 = p2;//子类对象赋值给父类对象,合法的
	//p2 = p1;//父类对象赋值给子类对象,不合法
	return 0;
}
原因:

基类指针可以指向派生类对象,派生类指针不能指向父类对象

子类对象可以赋值给父类对象,父类对象不能赋值给子类对象

#include<iostream>
using namespace std;

class base
{
	virtual void f() {}
};
class derive :public base
{};
class c :public derive
{};
class d :public derive, public base
{};
int main()
{
	//derive* pa = new base;//编译错误,派生类指针不能指向基类
	base* pa = new c;//pa指向派生类
					 //dynamic_cast将基类指针或引用安全转换为派生类指针或引用
	derive* pb = dynamic_cast<derive*>(pa);
	//指针绑定的对象时目标类型对象或者
	//其公有派生类对象就是对的
	base* p1 = new base;
//	base* p3;
	derive* p2 = dynamic_cast<derive*>(p1);
	//转换失败,指针转换失败为0,此时P2为NULL,如果是引用转换失败会抛出异常
	base* p4 = new d;
	derive* p5 = dynamic_cast<derive*>(p4);
	//这个也能转换成功
	base* p6 = new base;
	if (derive* p7 = dynamic_cast<derive*>(p6))
	{
		cout << "yes" << endl;
	}
	else
		cout << "no" << endl;
	return 0;

}
cosnt_cast

只能改变运算对象的底层const

int o=1;
const int *p=&o;//这是底层const
const int m=1;//这是顶层const

static_const

任何具有明确定义的类型,只要不包含底层const,都可以使用static_cast

int main()
{
	//a ba;
	const int* p = NULL;//底层const
	const int a = 1;//顶层const
	const_cast<int*>(p);//const_cast只能改变对象的底层const
						//ouble s = static_cast<double>(ba);报错,不存在自定义对象到
						//内置类型的转换
	double s = static_cast<double>(*p);//可以实现任何具有明确定义的类
									   //型转换,只要不包含底层const
	static_cast<int>(a);//可以改变顶层const,不会报错
						//const_cast<int>(a);报错,只能去除底层const

	p = &a;

	//derive* pa = new base;//编译错误,派生类指针不能指向基类
	base* pa = new c;//pa指向派生类
					 //dynamic_cast将基类指针或引用安全转换为派生类指针或引用
	derive* pb = dynamic_cast<derive*>(pa);
	//指针绑定的对象时目标类型对象或者
	//其公有派生类对象就是对的
	base* p1 = new base;
	//derive* p2 = dynamic_cast<derive*>(p1);//转换失败,指针转换失败为0
										   /*int l = 0;
										   int *p1 = NULL;
										   *(p1 + 1) = 1;
										   int *m = p1;
										   cout << *(p1+1) << endl;
										   cout <<*(m+1);*/
	return 0;

}


reinterpret_cast

用来处理无关类型之间的转换

它会产生一个新的值,这个值会有与原始参数(expressoin)有完全相同的比特位

不改变地址中存放的实质类型,但能帮助通过编译,运行可能会出错

reinterpret_cast用在任意指针(或引用)类型之间的转换,以及指针与足够大的整数类型之间的转换,从整数类型(包括枚举类型)到指针类型,无视大小

使用价值辅助哈希函数

关于reinterpret_cast更多介绍可看https://blog.csdn.net/smf0504/article/details/51436148