C++的类型转换-创新互联

C++的类型转换

C++的数据类型转换可分为隐式类型转换和显式类型转换

成都创新互联主要从事网站制作、网站设计、网页设计、企业做网站、公司建网站等业务。立足成都服务监利,10多年网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:18982081108

1、隐式类型转换

隐式类型转换用于内置数据类型的转换。编译时编译器对数据类型进行转换。

例如:

int nTemp = 36;

float fTemp = nTemp;

隐式类型转换也可以通过表达式、函数形参、函数返回值的方式进行。

2、显式数据类型转换

2.1 强制类型转换

(Type)expr

例如:

float ftemp;

int ntemp = 36;

ftemp = (float)ntemp;

强制类型转换使用于C编译器。

2.2 标准C++的类型转换

标准c++使用新的类型转换符static_cast、dynamic_cast、reinterpret_cast、const_cast对类型进行转换。

1)static_cast

static_cast(expression)

static_cast相当于传统的C语言里的强制转换,该运算符把expression转换为new_type类型,用来强迫隐式转换如non-const对象转为const对象,编译时检查,用于非多态的转换,可以转换指针及其他,但没有运行时类型检查来保证转换的安全性。它主要有如下几种用法:

①用于类层次结构中基类(父类)和派生类(子类)之间指针或引用的转换。

进行上行转换(把派生类的指针或引用转换成基类表示)是安全的;

进行下行转换(把基类指针或引用转换成派生类表示)时,由于没有动态类型检查,所以是不安全的。

②用于基本数据类型之间的转换,如把int转换成char,把int转换成enum。

③把空指针转换成目标类型的空指针。

④把任何类型的表达式转换成void类型。

注意:static_cast不能转换掉expression的const、volatile、或者__unaligned属性

char a = 'a';

int b = static_cast(a);//正确,将char型数据转换成int型数据

double *c = new double;

void *d = static_cast(c);//正确,将double指针转换成void指针

int e = 10;

const int f = static_cast(e);//正确,将int型数据转换成const int型数据

const int g = 20;

int *h = static_cast(&g);//编译错误static_cast 无法丢掉常量或其他类型限定符

2)dynamic_cast

dynamic_cast(expression)

转换方式:

dynamic_cast(e)

type必须是一个类类型且必须是一个有效的指针

dynamic_cast(e)

type必须是一个类类型且必须是一个左值

dynamic_cast(e)

type必须是一个类类型且必须是一个右值

e的类型必须符合以下三个条件中的任何一个:

① e的类型是目标类型type的公有派生类

② e的类型是目标type的共有基类

③ e的类型就是目标type的类型。

如果一条dynamic_cast语句的转换目标是指针类型并且失败了,则结果为0。如果转换目标是引用类型并且失败了,则dynamic_cast运算符将抛出一个std::bad_cast异常(该异常定义在typeinfo标准库头文件中)。e也可以是一个空指针,结果是所需类型的空指针。

dynamic_cast主要用于类层次间的上行转换和下行转换,还可以用于类之间的交叉转换(cross cast)。

在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的;在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全。dynamic_cast是唯一无法由旧式语法执行的动作,也是唯一可能耗费重大运行成本的转型动作。

指针转换

Derived *dp = dynamic_cast(bp)

引用转换

const Derived &d = dynamic_cast(b);

3)reinterpret_cast

reinterpret_cast(expression)

reinterpret_cast用于任意类型的转换,即reinterpret_cast运算符允许将任意指针转换到其他指针类型,也允许做任意整数类型和任意指针类型之间的转换。转换时,执行的是逐个比特复制的操作。reinterpret中文意为“重新解释; 重新诠释;”。

type-id 必须是一个指针、引用、算术类型、函数指针或者成员指针。

reinterpret_cast可以把一个指针转换成一个整数,也可以把一个整数转换成一个指针。我们必须知道指针的类型,然后把指针转换成整数和还原到原来的类型。否则这样的转换是很危险的。类型转换的安全性要程序员自己来保证。

reinterpret_cast是为了映射到一个完全不同类型的意思,这个关键词在我们需要把类型映射回原有类型时用到它。我们映射到的类型仅仅是为了故弄玄虚和其他目的,这是所有映射中最危险的。

reinterpret_cast使用注意事项:

从本质上说所有这些转换都是不安全的,依赖于实现的,或两者都是, reinterpret也不例外(存在安全性)。这种安全性只能由程序员自己来保证。

4)const_cast

const_cast是一个基于C语言编程开发的运算方法,其主要作用是:修改类型的const或volatile属性。使用该运算方法可以返回一个指向非常量的指针(或引用)指向b1,就可以通过该指针(或引用)对它的数据成员任意改变。

const_cast(expression)

该运算符用来修改类型的const或volatile属性。除了const 或volatile修饰之外, type_id和expression的类型是一样的。

①、常量指针被转化成非常量的指针,并且仍然指向原来的对象;

②、常量引用被转换成非常量的引用,并且仍然指向原来的对象;

③、const_cast一般用于修改底指针。如const char *p形式。

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧

新闻名称:C++的类型转换-创新互联
当前地址:https://www.cdcxhl.com/article32/coocpc.html

成都网站建设公司_创新互联,为您提供服务器托管企业网站制作网站建设关键词优化网站内链静态网站

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

外贸网站制作