除非必要,尽量不要对变量进行强制转换。这是因为强制转换是存在风险的,但实际上在某种情况下,转型是必需的。
旧式C转型方式为(type)expression,即由一对小括号加上一个对象名称组成,而这种语法结构在C++的任何地方都有可能使用,这就无法直观的判断出是否是转型操作。
在C++中,旧式的C转型方式并非是唯一的选择方式,我们有了新式的类型转换,与老式的C转换允许将任何类型转换为任何其他类型这种释放拙劣的行为相比,C++引入的新式的转换方式可精确地指明转换的意图。
1.static_cast
static_cast<type-id>(expression) 该运算符把expression转换为type-id类型,但没有运行时的类型检查来保证转换的安全性。
int fistNum,secondNum; int fistNum,secondNum;
double res = (double)firstNum/sencondNum; //旧式转换 double res = static_cast<double>(firstNum)/secondNum; //新式转换
static_cast用途比较广泛,编译器隐式执行的任何类型转换都可使用其来实现,几种用法如下
(1)用于类层次结构中基类和子类之间指针或引用的转换
(2)进行上行转换(把子类的指针或引用转换成基类表示)是安全的
(3)把空指针转换成目标类型的空指针
(4)把任何类型的表达式转换成void类型
(5)static_cast不能转换掉expression的const,volitale或_unaligned属性
(6)进行下行转换(把基类指针或引用转换成子类表示)时,由于没有动态类型检查,所以是不安全的。
(7)static_cast可用于将一个void*类型的指针强制转换为原来的指针类型,例如:
double d = 12;
void* p = &d;
double* pd = static_cast<double*>(p);
cout<<*pd<<endl; 输出结果12,说明转换后依然指向同一个地址。用于基本数据类型之间的转换。进行下行转换(把基类指针或引用转换成子类表示)
static_cast,const_cast,dynamic_cast,reinterpret_cast
原文:http://www.cnblogs.com/fenghuan/p/4853704.html