首先回顾一下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)一种类型表达式赋值给另一种类型的对象:目标类型是被赋值对象的类型
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
例外: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:避免出现可能多种转换的歧义 它主要有如下几种用法:
|