More effective C++ 今日一贴 之C++类型转换[1]
来源:互联网 发布:淘宝众筹如何推广 编辑:程序博客网 时间:2024/04/28 07:54
平常的编程中,当发生类型转换时,首先考虑的恐怕就是 C风格的类型吧.但是C风格的 类型转换确实并不尽如人意.
其一 , 它们太粗鲁了,允许任意类型之间的转换,特别是在多态时,当写过转换以后再次看到写的强制转换时,竟然忘掉了强制转换的目的;
其二,任何两种类型之间的转换都是采用同一种方式,也就是 一对括号家加上一个类型标识符组成,而括号和类型标识在C++里到处都是.这使得即使是回答诸如("这个程序用到类型转换了么?")之类简单的与类型转换相关的问题也非常棘手.
([color=Magenta]对于第二点还没有什么实际体会[/color])
于是出现了 4 种新的类型转换操作符 , 开发包出曾经用到过 reinterpret_cast
另外三种为:const_cast dynamic_cast static_cast
书写格式为 static_cast<type>(expression)
1.static_cast 于通用的C风格类型转换,具有同样的能力和含义,同样,它也具有C风格类型转换的限制
如 : 不能把一个DOUBLE 转换成为一个指针 ; 不能把一个结构体转换成为 INT (这两个我也没有试验过,不过明显可以看出,两种转换都属于字节长度不一致的数据类型之间的转换)
2.const_cast 去除一个对象的const 属性 或者 volatile属性
3. dynamic_cast 专用的类型转换,用来针对一个继承体系做向下或者横向的安全转换.也就是说把指向基类的指针(或引用)转换成指向派生类(或引用)或者基类兄弟类的指针(或引用), 而且能够检测转换是否成功, (这点非常重要)
4.reinterpret_cast 经常用于函数指针之间的转换,而且由转换者自己保证转换的安全.
如 typedef void (*FuncPtr)();
FuncPtr FuncPtrArray[10];
int doSomeThing();
如果你用 funcPtrArray[0] = &doSomething; 会出现编译错误
reinterpret_cast 可以让你强迫编译器以你的方式来看待问题
funcPtrArray[0] = reinterpret_cast<FuncPtr>(&doSomething);
其一 , 它们太粗鲁了,允许任意类型之间的转换,特别是在多态时,当写过转换以后再次看到写的强制转换时,竟然忘掉了强制转换的目的;
其二,任何两种类型之间的转换都是采用同一种方式,也就是 一对括号家加上一个类型标识符组成,而括号和类型标识在C++里到处都是.这使得即使是回答诸如("这个程序用到类型转换了么?")之类简单的与类型转换相关的问题也非常棘手.
([color=Magenta]对于第二点还没有什么实际体会[/color])
于是出现了 4 种新的类型转换操作符 , 开发包出曾经用到过 reinterpret_cast
另外三种为:const_cast dynamic_cast static_cast
书写格式为 static_cast<type>(expression)
1.static_cast 于通用的C风格类型转换,具有同样的能力和含义,同样,它也具有C风格类型转换的限制
如 : 不能把一个DOUBLE 转换成为一个指针 ; 不能把一个结构体转换成为 INT (这两个我也没有试验过,不过明显可以看出,两种转换都属于字节长度不一致的数据类型之间的转换)
2.const_cast 去除一个对象的const 属性 或者 volatile属性
3. dynamic_cast 专用的类型转换,用来针对一个继承体系做向下或者横向的安全转换.也就是说把指向基类的指针(或引用)转换成指向派生类(或引用)或者基类兄弟类的指针(或引用), 而且能够检测转换是否成功, (这点非常重要)
4.reinterpret_cast 经常用于函数指针之间的转换,而且由转换者自己保证转换的安全.
如 typedef void (*FuncPtr)();
FuncPtr FuncPtrArray[10];
int doSomeThing();
如果你用 funcPtrArray[0] = &doSomething; 会出现编译错误
reinterpret_cast 可以让你强迫编译器以你的方式来看待问题
funcPtrArray[0] = reinterpret_cast<FuncPtr>(&doSomething);
- More effective C++ 今日一贴 之C++类型转换[1]
- More Effective C++:类型转换
- More Effective C++:类型转换
- 《more effective c++》Item M5:谨慎定义类型转换函数
- [More Effective C++]尽量使用C++风格的类型转换
- 《More Effective C++》读书笔记一
- C++之谨慎定义类型转换函数(针对隐式类型转化)(4)---《More Effective C++》
- 读More Effective C++(1)
- More effective C++ 今日一贴 之自增自减运算符[2]
- 《More Effective C++》学习心得(一)
- 《More Effective C++》学习心得(四) 关于类中类型转换
- 利用重载避免隐式类型转换(More Effective C++_21(效率))
- 《More Effective C++》 Item M2:尽量使用C++风格的类型转换
- More Effective C++----(4)避免无用的缺省构造函数 & (5)谨慎定义类型转换函数
- More Effective C++----(21)通过重载避免隐式类型转换
- C++中尽量使用C++提供的类型转换(2)---《More Effective C++》
- 《more effective c++》读书笔记
- More Effective C++(2)
- javac 理解
- UNiSONSHIFT・ACCENT经典作品推荐 Chu×Chuアイドる和Chu×Chuぱらだいす~Encore Live~介绍(含下载和攻略)
- 代码中使用oracle数据库修改为DB2数据库的一些修改点
- 我总觉得是习近平救了刘翔
- Handling an AjaxCall
- More effective C++ 今日一贴 之C++类型转换[1]
- C#与EXCEL的数据交互
- 记事本程序
- CENTOS
- 关于A2W字符转换宏
- super关键字
- 开源数据库 Sharding 技术
- 非计算内存和计算内存的概念
- 数据类型