C++11强制类型转换

2023-05-17,,

C++ 强制类型转换有四种关键字:static_cast、const_cast、reinterpret_cast和dynamic_cast。它们用于不同的情况和目的,比C语言的强制类型转换更清晰和安全。static_cast用于数据类型和继承关系类间的明确定义的转换,const_cast用于去掉或加上底层const,reinterpret_cast用于低级别的指针或整数的转换,dynamic_cast用于多态类间的转换.

static_cast

基本使用:int a; static_cast<double>(a)

使用范围:一般用于数据类型得强制转换,此外:

基类与派生类(上行转换,派生-->基类,下行转换不安全)
空指针转化为目标类型指针
任何类型表达法转为void类型

const_cast

强制去掉不能被修改的常数特性(只能是指针或引用,而不能是变量数值)

尽量不要使用。

const int a = 10;

const int * p = &a;

int *q;

q = const_cast<int *>(p);

reinterpret_cast

使用范围:

改变指针引用类型:

int *a = new int;
double *d = reinterpret_cast<double *>(a);

整型与指针引用类型的相互转换

dynamic_cast

特点:运行时转换,需要做类型检查

范围:

不能用于内置的基本数据类型的强制转换(static_cast)

成功的话返回的是指向类的指针或引用,转换失败的话则会返回NULL

使用dynamic_cast进行转换的,基类中一定要有虚函数,否则编译不通过.类中存在虚函数,就说明它有想要让基类指针或引用指向派生类对象的情况,此时转换才有意义.这是由于运行时类型检查需要运行时类型信息,而这个信息存储在类的虚函数表.只有定义了虚函数的类才有虚函数表。

在类的转换时,在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的。在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全。

如下程序:

class Base{
void fun_a();
virtual void fun_b(); // 必须有一个虚函数才能被使用动态强制转换
}
class Derived:public Base{
void fun_c();
}
int main(){
Derived *p = new Base(); // error
Derived *p = static_cast<derived *>(new base); // compile true, but run error
p->fun_c();
Derived *p = dynamic_cast<derived *>(new base); // compile true, and p is NULL because call for function c not existed in Base class.
p->fun_c();
return 0;
}

C++11强制类型转换的相关教程结束。

《C++11强制类型转换.doc》

下载本文的Word格式文档,以方便收藏与打印。