第14章类型转换运算符

来源:互联网 发布:什么是淘宝秒杀 编辑:程序博客网 时间:2024/05/16 06:39

1.类型转换是一种机制,可以让程序员暂时或永久改变编译器对对象的解释

2.c++提供了4种类型转换运算符static_cast dynamic_cast reinterpret_cast const_cast

3.static_cast用于相关类型之间的转换。再转换指针的时候,static_cast会进行基本的检测

cbase是cderived的一个父类

cbase * pbase = new cderived();//这里创建了一个cderived的对象,指针类型定义的时cbase

cderived * pderived = static_cast<cderived*> (pbase);//这一段代码是正确的,把cbase的指针换成了cderived的指针,并赋值给pderived。

这本身也是正确的,因为pbase指向的位置被来就是一个cderived的对象

 

下面这个代码就是错误的

cunrelated * punrelated = static_cast6<cunrelated>(pbase);

这是因为pbase和cunrelated没有任何关系,不能把不同的类型的类的对象进行强制转换

 

但是static_cast 只会进行指针类型的检测,并不会对运行阶段进行检测,下面的代码也是错误的,

cbase * pbase = new cabse();

cderived * pderived = static_cast<cderived*>(pbase);

这是因为pbase是一个cbase的实例,如果转换成cderived的类型,那么在调用一些在cbase中没有但是cderived中扩充的方法时,就会出错。

语法上没有问题,但是逻辑上,在程序运行时可能会导致错误

 

double a=1.234;

int b=a;

上面这个是隐式的转换,b的值是1.通过static_cast可以显示的进行转换。

int b=static_cast<int>(a);

 

 4.dynamic_cast

动态类型转换,在运行阶段进行转换

cbase *pbase = new cderived();

cderived *pderived = dynamic_cast<cderived*>(pbase);

if(pderived)

{

pderived->callfunction();

}

上面代码就是一个dynamic_cast的例子。就是创建一个父类的指针,但是指向的内容是一个子类的对象。然后把这个父类的指针进行转换成一个子类的指针,判断是否成功,如果成功,则调用子类的函数

 

这样做的意义在于,当你在程序运行过程中,如果碰到一个父类指针,但是不能确定到底指向的是那个子类,可以用这个方法进行判断,并依据情况做出不同的响应

class canimal

{

public:

virtual void speak()=0;

};

class cdog: public canimal

{

public:

void wagtail(){cout <<"dog wag"<<endl;}

void speak(){cout<<"dog bow"<<endl;}

};

class ccat : public canimal

{

public:

void catchmice(){cout<<"cat catch"<<endl;}

void speak(){cout<<"cat meow"<<endl;}

};

void determinetype(canimal *panimal)

{

cdog * pdog = dynamic_cast<cdog*>(panimal);

if(pdog)

{

cout << "dog"<<endl;

pdog->wagtail();

}

ccat * pcat = dynamic_cast<ccat *>(panimal);

if(pcat)

{

cout <<"cat"<<endl;

pcat->catchmice();

}

5.reinterpret_cast

由名字可以知道,这个是对类型进行重新定义然后转换。也就是可以把两个没有任何关系的类型进行转换。一般我们不会用到这些,因为这样没有意义,也会导致很多问题。但是在驱动编程等低级程序里面,却会用到。因为比较底层可能有的类型没有或是不支持。但是我们可以转换成二进制或是一些基本的格式,不改变数据,自己进行解析

cclass *pobject = new cclass();

unsigned char *pbyte = reinterpret_cast<unsigned char*>(pobject);

6.const_cast

这个就是解除const的作用。比如,我有个const变量要传递给一个函数,但是函数的参数确不是const的,这个时候就需要把这个const变量解除const然后传递给函数

void Printer (int* val)

{

cout << val<< endl;

}

int main(void)

{

const int consatant = 20;

Printer(const_cast<int *>(&consatant));

return 0;

}