参考:http://www.cnblogs.com/chio/archive/2007/07/18/822389.html
首先回顾一下C++类型转换:
C++类型转换分为:隐式类型转换和显式类型转换
第1部分. 隐式类型转换
又称为“标准转换”,包括以下几种情况:
1) 算术转换(Arithmetic conversion) : 在混合类型的算术表达式中,
最宽的数据类型成为目标转换类型。
int ival = 3;
double dval = 3.14159;
ival + dval;//ival被提升为double类型
double dval = 3.14159;
ival + dval;//ival被提升为double类型
2)一种类型表达式赋值给另一种类型的对象:目标类型是被赋值对象的类型
int *pi = 0; // 0被转化为int *类型
ival = dval; // double->int
ival = dval; // double->int
例外:void指针赋值给其他指定类型指针时,不存在标准转换,编译出错
3)将一个表达式作为实参传递给函数调用,此时形参和实参类型不一致:目标转换类型为形参的类型
extern double sqrt(double);
cout << "The square root of 2 is " << sqrt(2) << endl;
//2被提升为double类型:2.0
cout << "The square root of 2 is " << sqrt(2) << endl;
//2被提升为double类型:2.0
4)从一个函数返回一个表达式,表达式类型与返回类型不一致:目标转换类型为函数的返回类型
double difference(int ival1, int ival2)
{
return ival1 - ival2;
//返回值被提升为double类型
}
{
return ival1 - ival2;
//返回值被提升为double类型
}
第2部分.
显式类型转换
显式类型转换
被称为“强制类型转换”(cast)
C 风格: (type-id)
C++风格: static_cast、dynamic_cast、reinterpret_cast、和const_cast..
关于强制类型转换的问题,很多书都讨论过,写的最详细的是C++ 之父的《C++ 的设计和演化》。最好的解决方法就是不要使用C风格的强制类型转换,而是使用标准C++的类型转换符:static_cast, dynamic_cast。标准C++中有四个类型转换符:static_cast、dynamic_cast、reinterpret_cast、和const_cast。下面对它们一一进行介绍。
static_cast
用法:static_cast < type-id > ( expression )
说明:该运算符把expression转换为type-id类型,但没有运行时类型检查来保证转换的安全性。
来源:为什么需要static_cast强制转换?
情况1:void指针->其他类型指针 情况2:改变通常的标准转换 情况3:避免出现可能多种转换的歧义
注意:static_cast不能转换掉expression的const、volitale、或者__unaligned属性。
dynamic_cast
用法:dynamic_cast < type-id > ( expression )
说明:该运算符把expression转换成type-id类型的对象。Type-id必须是类的指针、类的引用或者void *;如果type-id是类指针类型,那么expression也必须是一个指针,如果type-id是一个引用,那么expression也必须是一个引用。
来源:为什么需要dynamic_cast强制转换?
简单的说,当无法使用virtual函数的时候 典型案例: Wicrosoft公司提供给我们一个类库,其中提供一个类Employee.以头文件Eemployee.h和类库.lib分发给用户 显然我们并无法得到类的实现的源代码
//Emplyee.h
class Employee { public: virtual int salary(); }; class Manager : public Employee { public: int salary(); }; class Programmer : public Employee { public: int salary(); };
class MyCompany
{ public: void payroll(Employee *pe); // }; void MyCompany::payroll(Employee *pe) { //do something }
//Emplyee.h
class Employee { public: virtual int salary(); virtual int |