类型转换
隐式类型转换
- 负数转化为无符号类型,通常会采用二进制补码表示。(编译器不警告有符号和无符号整数类型之间的隐式转换)
int a= -1 ;
unsigned int b = a;// 6=232 -1=4294967295189
- 无论是转换到bool类型或者是有bool类型进行转换: false等价于0(数值类型)或者空指针(指针类型);true则等价于其它任何数值或者由true转化为1
int a = -2:
bool b= a;//则b= true
- 浮点数转化为整数会采取截断操作。如果转换时发生了数值溢出,可能出现未定义的行为。
float a = -1.5f;
int b-a;// b= -1
- 一个C风格的数组隐式把数组的第一个元素转换为一个指针。
char* s=“Hello World"+ 4;
显式类型转换
我们经常会看到会有如下的常量定义:
const std: : string SLOGAN=“Good good study,day day up. ";
这其中是因为C++编译器帮我们做了隐式转换,将const char*类型转换成std:string类型
const std: :string SLOGAN("Good good study,day day up.”);
explicit关键字
C++提供了关键字explicit,可以阻止构造函数进行隐式转换的发生声明为explicit的构造函数不能在隐式转换‘使用
限定条件
explicit关键字只能用来修饰类的构造函数
explicit关键字作用于单个参数的构造函数explicit关键字不能被继承
显式类型转换,类型转换操作符
XXX_cast <new_type> (expression)
static_cast
- static_cast强制转换只会在编译时检查,但没有运行时类型检查来保证转换的安全性
- 用于类层次结构中基类和子类之间指针或引用的转换:进行上行转换(子类->父类)是安全的;进行下行转换(父类->子类)时,由于没有动态类型检查,所以是不安全的
- 用于基本数据类型之间的转换,如把int转换成char,把int转换成enum。这种转换的安全性也要开发人员来保证
- 把void*指针转换成目标类型的指针,此种转换方式不安全
- 把任何类型的表达式转换成void类型
- 将enum class值转化为整数或者浮点数
- 转换为右值引用
static_cast
- static_cast强制转换只会在编译时检查,但没有运行时类型检查来保证转换的安全性
- 用于类层次结构中基类和子类之间指针或引用的转换:进行上行转换(子类->父类)是安全的;进行下行转换(父类->子类)时,由于没有动态类型检查,所以是不安全的
- 用于基本数据类型之间的转换,如把int转换成char,把int转换成enum。这种转换的安全性也要开发人员来保证
- 把void*指针转换成目标类型的指针,此种转换方式不安全
- 把任何类型的表达式转换成void类型
- 将enum class值转化为整数或者浮点数
- 转换为右值引用
dynamic_cast
new_type 必须是一个指针或引用或“指向void*的指针”
00617899
·如果new_type是指针,则expression 的类型必须是指针,如果new_type是引用,则expression为左。值。如果转型失败会返回nullptr(转型对象为指针时)或抛出异常(转型对象为引用时)。
dynamic_cast使用RTTl来进行类型安全检查,因此dvnamic cast左在二定的领率损生)n617899
const_cast
. new_type必须是一个指针、引用或者指向对象类型成员的指针。
.const cast用于去除除对象的const
reinterpret_cast
. new type必须是一个指针、引用、算术类型、函数指针或者成员指针。
其转换结果与编译平台息息相关,不具有可移植性,因此在一般的代码中不常见到它。
reinterpret _cast 常用的一个用途是转换函数指针类型,即可以将一种类型的函数指针转换为另一种类型的函数指针,但这种转换可能会导致不正确的结果。
reinterpret cast就是对指针类型进行重新解释,非常类似纯C风格的指针类型强转
类型转换运算符
类型转换操作符(type conversion operator)是一种特殊的类成员函数,它定义将类类型值转变为其他类型值的转换。转换操作符在类定义体内声明,在保留字operator 之后跟着转换的目标类型。
函数原型
T1: : operator T2lconst];
·转换函数必须是成员函数,不能指定返回类型,且形参表必须为空;返回值是隐含的,返回值是与转换的类型相同的,即为上面原型中的T2;
T2表示内置类型名(built-in type)、类类型名(class type)或由类型别名(typedef)定义的名字;对任何可作为函数返回类型的类型(除了void 之外)都可以定义转换函数,一般而言,不允许转换为数组或函数类型,转换为指针类型(数据和函数指针)以及引用类型是可以的;
·转换函数一般不应该改变被转换的对象,因此转换操作符通常应定义为const成员;·支持继承,可以为虚函数;
·只要存在转换,编译器将在可以使用内置转换的地方自动调用它;