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++的类型转换-创新互联
分享地址:http://myzitong.com/article/coocpc.html