C++官方参考链接:Type conversions - C++ Tutorials (cplusplus.com)
类型转换
隐式转换
将值复制到兼容类型时,将自动执行隐式转换。例如:
short a=2000;
int b;
b=a;
在这里,a的值从short提升为int,而不需要任何显式操作符。这被称为标准转换。标准转换影响基本数据类型,并允许在数值类型(short到int、int到float、double到int…)、到/从bool和一些指针的转换。
从某个较小的整数类型转换为int,或从float转换为double被称为提升,并保证在目标类型中产生完全相同的值。算术类型之间的其他转换可能并不总是能够精确地表示相同的值:
如果将一个负整数值转换为无符号类型,则结果值对应于其2的补位表示(即,-1成为该类型可表示的最大值、-2为第二大值,…)。
从/到bool类型的转换认为false等效于0(对于数值类型)和空指针(对于指针类型);true等价于所有的其他值,并被转换为等价于1。
如果从浮点类型转换为整数类型,则值将被截断(小数点部分被删除)。如果结果不在类型可表示值的范围内,则转换会导致未定义的行为。
否则,如果转换是在相同类型的数值类型(整数到整数或浮点数到浮点数)之间进行的,则转换是有效的,但值是特定于实现的(并且可能不可移植)。
其中一些转换可能意味着精度的损失,编译器可以用警告发出信号。通过显式转换可以避免此警告。
对于非基本类型,数组和函数隐式转换为指针,而指针通常允许以下转换:
空指针(NULL)可以转换为任何类型的指针
任何类型的指针都可以转换为void指针。
指针向上转换:指向派生类的指针可以转换为可访问且明确的基类的指针,而无需修改其const或volatile限定。
类的隐式转换
在类的世界中,隐式转换可以通过以下三个成员函数来控制:
*单实参构造函数:允许从特定类型进行隐式转换以初始化对象。
*赋值操作符:允许在赋值时从特定类型进行隐式转换。
*类型强制转换操作符:允许隐式转换到特定类型。
例如:
// implicit conversion of classes:
#include
using namespace std;
class A {};
class B {
public:
// conversion from A (constructor):
B (const A& x) {}
// conversion from A (assignment):
B& operator= (const A& x) {return *this;}
// conversion to A (type-cast operator)
operator A() {return A();}
};
int main ()
{
A foo;
B bar = foo; // calls constructor
bar = foo; // calls assignment
foo = bar; // calls type-cast operator
return 0;
}

类型强制转换操作符使用一种特定的语法:它使用operator关键字,后跟目标类型和一组空括号。注意,返回类型是目标类型