类型转换

来源:互联网 发布:天祥网络 编辑:程序博客网 时间:2024/06/06 13:43

c风格的类型转换

(type)expression

#include<iostream>using namespace std;int main(){    int num = (int)1.0003;//c语言风格类型转换    cout << num<<endl;    system("pause");    return 0;}

运行结果

这种转换是c风格的类型转换,也叫强制转换


c++风格的类型转换

static_cast(expression)

#include<iostream>using namespace std;int main(){    int num =static_cast<int>(1.0003);//c++风格类型转换    cout << num<<endl;    system("pause");    return 0;}

这里写图片描述

这种转换是c++风格的转换但它并不是强制转换,而是表示转换


const_cast< type >(expression)

#include<iostream>using namespace std;int main(){    const int n = 10;    const int *p = &n;    int *q = const_cast<int *>(p);    *q = 9;    cout << q << " " << *q << endl;    cout << p << endl;    system("pause");    return 0;}

这里写图片描述

从运行结果可以看出:

int *q = const_cast<int *>(p);这句代码成功将const int *类型的p转换成了int *赋给了int *类型的q


从输出结果可以看到*q的值变成了9,也就是说修改q所指向内存内的数据成功了,从p和q的输出值可以看出它们是指向同一块内存的既然通过q访问的内存内的值改变了,那么是否意味着p所指向的内存内的值也就是const int类
型变量n的值也被改变了呢?


#include<iostream>using namespace std;int main(){    const int n = 10;    const int *p = &n;    int *q = const_cast<int *>(p);    *q = 9;    cout << q << " " << *q << endl;    cout << p << " " << n << endl;    system("pause");    return 0;}

这里写图片描述

从运行结果可以看出:

n的只并没有改变,也就是说const_cast只是为了去除const对变量的限定,并没用去除const变量的不可修改性。


reinterpret_cast< type >(expression)

reinterpret_cast是C++里的强制类型转换符。使用它可以修改了操作数类型,但仅仅是重新解释了给出的对象的比特模型而没有进行二进制转换


1.任意类型指针之间转换

#include<iostream>using namespace std;int main(){    int *m =new int(2);    double *n = reinterpret_cast <double*>(m);    int* p = reinterpret_cast <int*>(n);    cout << *n<<endl<<*p<< endl;    system("pause");    return 0;}

这里写图片描述

从输出结果可以看出,它只是修改了操作数类型并没有进行二进制转换,所以将int * m强制转换为 double *n后,输出double的值并不是2,只就相当于将一个以int方式存储的值用double的解析方式读取所以输出的值并不是像c风格的强转那样。


2.指针和整数之间相互转化
reinterpret_cast可以将一个指针的值转换为一个足够大的整数值,也可以将一个整数值转换为任意类型的指针
(先将一个指针转换为一个足够大的整数,在将这个整数转换为原来的类型任然可以得到原来的指针地址)

#include<iostream>using namespace std;int main(){    int *m =new int(2);    int n = reinterpret_cast <int>(m);    int* p = reinterpret_cast <int*>(n);    cout << n << endl;    cout << m << endl;    cout<< p << endl;    system("pause");    return 0;}

运行结果如图所示:
这里写图片描述

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 学校补助卡丢了怎么办 学校交学费的卡丢了怎么办 采购零星材料无发票怎么办 租房合同弄丢了怎么办 买房的合同丢了怎么办 押金的收据丢了怎么办 房东的合同掉了怎么办 个人档案里单位没有放合同怎么办 签的合同掉了怎么办 一方合同弄丢了怎么办 合同丢了怎么办如何补 签了定金合同对方违约怎么办 医学出生证明丢了怎么办 易通行出站未刷怎么办 炭烧酸奶过期了怎么办 西安建行etc坏了怎么办 电机在设备壳体中拔不出来怎么办 公司变更股东不能亲临现场怎么办? 公司股东变更老股东不签字怎么办 公司变更地址股东不签字怎么办 公司变更股份股东不签字怎么办 公司股东离职股东没变更过来怎么办 河南省宋基投资公司欠钱怎么办 曲江楼观2O18怎么办 华旭金卡身份证扫描不了怎么办 水表里有钱没水怎么办? ff14过图速度慢怎么办 想让电表跑的慢怎么办 家里电表突然没有电了怎么办 电表不识别电卡怎么办 家里水表不转了怎么办 车管所体检色弱怎么办 煤气押金单没了怎么办 中国建设银行登录密码忘了怎么办 中国建设银行登录密码忘记了怎么办 公司车辆怎么办换新能源牌 杭州新能源汽车牌照外地人怎么办 建行登录密码忘了怎么办 新捷达epc灯亮怎么办 捷达车玻璃升降偏离怎么办 交金中断一个月怎么办