c语言类型转换,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对象,编译器就会调用该操作符生成一个临时对象,做一个隐式类型转换。
Tags:  强制类型转换 c变量类型转换 c强制类型转换 c类型转换 c语言类型转换

延伸阅读

最新评论

发表评论