C++的类型转换

四种显式类型转换操作符:

static_cast(x)

只能进行规则允许的类型转换,所谓规则允许包括三种情况:1.语言内建(int到float,enum到int,float到int等等);2.继承体系中的向上转型,即将一个子类对象转型为基类对象;3.单参数构造函数,如果存在以T1为单参数的T2构造函数,就可以将T1转型为T2,不需要T1和T2在同一个继承体系中。

除此之外,不对参数类型做任何要求,可以是对象、内建类型、指针、引用,都可以。

dynamic_cast(x)

这个操作符只能针对引用或指针进行类型转换,它通常用于类型判断。比如x是一个指针,我们要判断它是否指向一个T对象,可以看dynamic_cast(x)能否返回一个T*,如果x确实指向一个T对象或者T的子类对象,且要求T是它的可访问的基类(不能是protected),则返回一个T*,否则返回空指针。具体操作上,dynamic_cast操作符会查看x指向的对象(如果有的话),如果该对象属于T类,或者有唯一的类型为T的基类,就返回一个T*,并且指向该对象,否则就返回空指针。除了判断指针类型外也可以判断引用类型,方法类似。

const_cast

设定或者去除类型的常数性(constness),也能去除volatile修饰符(用于限制编译器优化的修饰符),除此之外不允许做任何转换。

reinterpret_cast

此操作符可以在任何毫不相关的类型之间转换,只保证转换前后的二进制位相同。

上述四种类型转换操作符是C++提供用来代替C中的括号式类型转换的((int)x),因为这样可以提供给编译器更多的信息(转换的目的),方便编译器进行一些类型检查。

除此之外,C++还提供1.单参数构造函数,2.member type conversion operator方式来进行类型转换。

如果一个类A有一个接受类型B参数的构造函数,那么在一个需要A对象的地方,提供一个B对象,编译器就会调用该构造函数生成一个临时对象,做一个隐式类型转换。

如果一个类A定义了一个A::operator B()的操作符,那么在一个需要A对象的地方,提供一个B对象,编译器就会调用该操作符生成一个临时对象,做一个隐式类型转换。

你可能感兴趣的:(C++的类型转换)