C++笔记9--类型强转(type cast)

来源:互联网 发布:南方报业招聘网络编辑 编辑:程序博客网 时间:2024/06/06 01:26

C++笔记9--类型强转(type cast)

                                                                                                                              声明:本文档由王桂林老师编写的C++课件,经整理而出。

类型转换有C风格的,当然还有C++风格的。
C风格的转换的格式很简单(TYPEEXPRESSION),但是C风格的类型转换有不少的缺点,有的时候用C风格的转换是不合适的,
因为它可以在任意类型之间转换,比如你可以把一个指向 const 对象的指针转换成指向非const 对象的指针, 把一个指向基类对象的指针转换成指向一个派生类对象的指针, 这两种转换之间的差别是巨大的,
但是传统的C语言风格的类型转换没有区分这些。还有一个缺点就是,C风格的转换不容易查找,他由一个括号加上一个标识符组成,
而这样的东西在C++程序里一大堆。所以C++为了克服这些缺点,引进了新的类型转换操作符。


静态类型转换
语法格式:
static_cast<目标类型> (标识符)
转化规则:
在一个方向上可以作隐式转换,在另外一个方向上就可以作静态转换。

int a = 10;int b = 3;cout<<static_cast<float>(a)/b<<endl; //float = int int = floatreturn 0;int *p; void *q;p = static_cast<int*>(q);char *p = static_cast<char*>(malloc(100));


重解释类型转换
语法格式:
reinterpret_cast<目标类型> (标识符)
转化规则:
通常为操作数的位模式提供较低层的重新解释”也就是说将数据以二进制存在形式
的重新解释,在双方向上都不可以隐式类型转换的,则需要重解释类型转换。
int main(){    int x = 0x12345648;    char *p = reinterpret_cast<char*>(&x);    //char*p = static_cast<char*>(&x);    printf("%x\n",*p);    int a[5] = {1,2,3,4,5};    int *q = reinterpret_cast<int*>((reinterpret_cast<int>(a) +1));    printf("%x\n",*q);    return 0;}


脱常类型转换
语法格式:
const_cast<目标类型> (标识符) //目标类类型只能是指针或引用。
语法规则:
用来移除对象的常量性(cast away the constness)使用 const_cast 去除 const 限定的
目的不是为了修改它的内容,使用 const_cast 去除 const 限定,通常是为了函数能够接受这个实际参数。

应用场景:

#include <iostream>using namespace std;void func(int & ref) //别人己经写好的程序或类库{    cout<<ref<<endl;}int main(void){    const int m = 4444;    func(const_cast<int&>(m));    return 0;}


动态类型转换
语法格式:
dynamic_cast<目标类型> (标识符)
用于多态中的父子类之间的强制转化。

0 0
原创粉丝点击