7、不一样的C++系列--C++类型转换
来源:互联网 发布:学美妆软件 编辑:程序博客网 时间:2024/05/21 17:12
C++中的类型转换
强制类型转换
- C方式的强制类型转换
- (Type)(Expression)
- Type (Expression)
发一个非常粗暴的转换栗子:
typedef void(PF)(int);struct Point{ int x; int y;};int v = 0x12345;PF* pf = (PF*)v;char c = char(v);Point* p = (Point *)v;
- C方式强制类型转换存在的问题
- 过于粗暴
- 任意类型之间都可以进行转换,编译器很难判断其正确性
- 难于定位
- 在源码中无法快速定位所有使用强制类型转换的语句
- 过于粗暴
新的类型转换
- C++将强制类型转换分为4种不同的类型
- static_cast
- const_cast
- dynamic_cast
- reinterpret_cast
用法: xxx_cast < Type > (Expression)
static_cast
强制类型转换- 用于基本类型间的转换
- 不能用于基本类型指针间的转换
- 用于有继承关系类对象之间的转换和类指针之间的转换
const_cast
强制类型转换- 用于去除变量的只读属性
- 强制转换的目标类型必须是指针或引用
reinterpret_cast
强制类型转换- 用于指针类型间的强制转换
- 用于整数和指针类型间的强制转换
dynamic_cast
强制类型转换- 用于有继承关系的类指针间的转换
- 用于有交叉关系的类指针间的转换
- 具有类型检查的功能
- 需要虚函数的支持
举一个栗子:
#include <stdio.h>void static_cast_demo(){ int i = 0x12345; char c = 'c'; int* pi = &i; char* pc = &c; //可以正确转换 c = static_cast<char>(i); //不能正确转换,因为static_cast只能用于基本类型间的转换 pc = static_cast<char*>(pi);}void const_cast_demo(){ const int& j = 1; //可以正确转换 因为是去除引用的const属性 int& k = const_cast<int&>(j); const int x = 2; //可以正确转换,因为是去除引用的const属性 int& y = const_cast<int&>(x); //转换错误,因为不能用于去除基本类型的const属性 int z = const_cast<int>(x); k = 5; //输出 5 5 printf("k = %d\n", k); printf("j = %d\n", j); y = 8; //输出 2 因为x是常量,为了兼容c,直接取的符号表中的值 printf("x = %d\n", x); //输出8 printf("y = %d\n", y); //输出2个一样的地址 printf("&x = %p\n", &x); printf("&y = %p\n", &y);}void reinterpret_cast_demo(){ int i = 0; char c = 'c'; int* pi = &i; char* pc = &c; //可以正确转换,是指针之间的转换 pc = reinterpret_cast<char*>(pi); //可以正确转换,是指针之间的转换 pi = reinterpret_cast<int*>(pc); //可以正确转换,因为是整数与指针之间的转换 pi = reinterpret_cast<int*>(i); //转换错误,因为是基本类型间的转换 c = reinterpret_cast<char>(i); }void dynamic_cast_demo(){ int i = 0; int* pi = &i; //转换错误,类型不匹配 char* pc = dynamic_cast<char*>(pi);}int main(){ static_cast_demo(); const_cast_demo(); reinterpret_cast_demo(); dynamic_cast_demo(); return 0;}
阅读全文
0 0
- 7、不一样的C++系列--C++类型转换
- 25、不一样的C++系列--类型转换函数
- 1、不一样的C++系列--C到C++的升级
- 37、不一样的C++系列--C语言异常处理
- <C/C++> 类型转换
- C/C++:类型转换
- C#.NET 的 类型转换
- C语言的类型转换
- C语言的类型转换
- C语言的类型转换
- c语言的类型转换
- C++/C指针的类型转换
- 39、不一样的C++系列--类型识别
- Objective C 不一样的语法
- 1 不一样的 C 基础
- 不一样的C语言-变量
- 不一样的随机数生成方法(C/C++)
- C类型转换
- 富不过三代已成过去,解答为什么越有钱的越有钱?
- u3d DoTween子物体回到原位
- 图片加载框架
- 6、不一样的C++系列--New关键字和命名空间
- 跟我学Redis——Redis安装
- 7、不一样的C++系列--C++类型转换
- [paper] Look Into Person
- 关于Web服务器的认识
- 楼层丢鸡蛋问题
- Linux /根目录下子目录的存放内容
- View绘制及事件分发机制
- JAVA基础知识大纲-初级工程师必须知道的35个知识点
- Java中循环删除list中的元素
- hbase常用工具