C++中类型的转换

来源:互联网 发布:淘宝千里眼好用不 编辑:程序博客网 时间:2024/05/21 04:17

欢迎批评指针大笑

一、C++中内置类型的转换  

将一个标准类型变量的值赋给另一个标准类型变量时,如果这两种类型相互兼容,则C++自动将这个值转换为接收变量的类型: 

 int count = 3.33; //将浮点型自动转化为int型,但是会丢失精度 

  double time = 11;//将int型转化为浮点型 

  上述语句都是可行的,因为在C++看来各种数值类型都是相同的东西—-一个数字,并且C++包含用于转换的内置规则。但是对于不兼容的类型,则不能执行自动转换,例如:int  *ptr = 10此语句是不能通过编译的,因为一个是指针类型,另一个是整数类型。然而,不能通过自动转换时,可以执行强制类型转换,int *ptr = (int  *)10//此语句是正确的。 

 二、C++中自定义类类型的转换  

C++中内置类型的转换太过松散,而不能适用于自定义类类型的转换,为了解决这种松散的情况,C++添加了四种类型转换的运算符,使过程更加规范: 

dynamic_cast <type_name>expression;

const_cast <type_name>expression;  

static_cast<type_name> expression; 

reinterpret_cast<type_name>expression;  

其中,type_name为目标类型,expression为源类型。 

下面对四种类型转换运算符进行逐一介绍:  

dynamic_cast <type_name>expression

该运算符的作用是,使得能够在类层次结构中进行向上转换,而不允许其它转换。  

例如,High和Low是两个类,ph和pl分别为High*和Low*类型,则仅当Low是High可访问的基类时,下面的语句才将Low*指针赋给pl 

pl = dynamic_cast<Low *>ph;

否则,该语句将空指针赋值给pl。

const_cast <type_name>expression

该运算符只执行一种用途的类型转换,即移除变量的const属性,而其它属性不变。也就是说除了const属性不同外,type_name和expression类型必须相同。我们之所以需要这种转换,是因为我们需要这样一个变量,它在大多时候是常量,有时它的值又需要改变的。

例如:High和Low是两个类

High bar;

const High *pbar = &bar;

High *pb = const_cast<High *>pbar;//valid

const Low *pl = const_cast<Low *>pbar;//invalid

第一个转换是合法的,使得*pb成为可以修改bar对象值得指针,它删除了const的标签;第二个转换是非法的,它尝试将const High*转化为const Low*。

static_cast<type_name> expression

仅当type_name所属的类型可以隐式转换为expression所属的类型时,或者expression所属的类型可以隐式转换为type_name所属的类型时,转换才是有效的。

例如:类A是类B的基类,C是另外不同的类,从类A到类B转换或者从类B到类A的转换都是合法的,而从类C到类A的转换是非法的。

reinterpret_cast <type_name>expression

interpret是解释的意思,reinterpret即为重新解释,此标识符的意思即为数据的二进制形式重新解释,但是不改变其值。如:int i; char *ptr="hello freind!"; i=reinterpret_cast<int>(ptr);这个转换方式很少使用。





1 0
原创粉丝点击