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
上一篇: java的四种类型的引用
下一篇: SQL Server性能分析