C++中4个与类型转换相关的关键字

static_cast

const_cast

dynamic_cast

reinterpret_cast

一.类型转换

    表达式是否合法取决于操作数的类型,而且合法的表达式其含义也由操作数类型决定。在C++中,某些类型之间存在相关的依赖关系。若两种类型相关,则可在需要某种类型的操作数位置上,使用该类型的相关类型对象或值。如果两个类型之间可以相互转换,则称这两个类型相关。

    “转换”是一种编译器指令,大部分情况下他不改变一个指针所含的真正地址,他只影响“被指出之内存大小和其内容”的解释方式。

二.四种与类型转换相关的关键字

1.static_cast--运算符完成相关类型之间的转换

在同一类层次结构中的一个指针类型到另一个指针类型,整形到枚举,浮点型到整形等。

例:

int m=0;
double n=static_cast<int>m;

int *p=static_cast<int*>(malloc(100));

2.const_cast--移除变量的const或volatile限定符

//volatile:指令关键字,确保本条指令不会因为编译器的优化而省略,且要求每次直接读值

3.dynamic_cast--处理基类到派生类的转换(基类必须有虚函数,为多态时可以转换)

它是运行时进行类型检测的类型转换,如果绑定到引用或指针的对象不是目标类型的对象,则dynamic——cast创建失败。

将基类的指针或引用安全地转换为派生类的指针或引用。当虚函数不能使用的时候,再使用dynamic_cast关键字,从基类指针获得派生类行为。

class Base

{

public:

   virtual int test(){return 0;} //基类中存在虚函数,故在派生类中存在虚函数指针指向虚函数表。

};

class Derived:public Base

{

public:

   virtual int test(){return 1;}

};

int main()

{

Base cbase;

Derived cderived;

Base *p1=new Base;

Base *p2=new Derived;

Derived* pD1=dynamic_cast<Derived*>(p1);//p1没有真正指向派生类,pD1置为0

Derived* pD2=dynamic_cast<Derived*>(p2); //正确

//Derived& pd1=dynamic_cast<Derived&>(*p1);//p1没有真正指向派生类,pd1抛出异常

Derived& pd2=dynamic_cast<Derived&>(*p2);//正确

return 0;

}

4.reinterpret_cast--处理互不相关类型之间的转换

它可以转换任何内置的数据类型为其他任何的数据类型,也可以转换任何指针类型为其他的类型。他甚至可以转换内置的数据类型为指针,无需考虑类型安全或者常量的情形,不到万不得已不使用它。

int a=10;
double *b=reinterpret_cast<double*>(a)//b的转换结果为0x0000000a


猜你喜欢

转载自blog.csdn.net/humeapz/article/details/81061264
今日推荐