More Effective C++ 阅读笔记(二) -- C++的新型类型转换(造型Cast)
2008-08-06 09:29
453 查看
More Effective C++ 阅读笔记(二) -- C++的新型类型转换(造型Cast)
黑月亮 发表于 2005-10-1 21:57:00
C++的新型类型转换(造型Cast)
C++的新型类型转换共有四种方法代替传统的C造型(即(type)expression)
这四个操作符是, static_cast, const_cast, dynamic_cast, 和reinterpret_cast。在大多数情况下,对于这些操作符你只需要知道原来你习惯于这样写:(type) expression 而现在你总应该这样写:static_cast<type>(expression)
1.static_cast 与c转换功能一样,但不能把struct转换成int类型或者把double类型转换成指针类型,另外,static_cast不能从表达式中去除const属性(const_cast完成)
2.const_cast用于类型转换掉表达式的const或volatileness属性。通过使用const_cast,你向人们和编译器强调你通过类型转换想做的只是改变一些东西的constness或者 volatileness属性。
3.dynamic_cast,它被用于安全地沿着类的继承关系向下进行类型转换。这就是说,你能用dynamic_cast把指向基类的指针或引用转换成指向其派生类或其兄弟类的指针或引用,而且你能知道转换是否成功。失败的转换将返回空指针(当对指针进行类型转换时)或者抛出异常(当对引用进行类型转换时):
4.reinterpret_cast。它的类型转换,其的转换结果几乎都是执行期定义(implementation-defined)。因此,使用reinterpret_casts的代码很难移植。reinterpret_casts的最普通的用途就是在函数指针类型之间进行转换。例如,假设你有一个函数指针数组:
typedef void (*FuncPtr)(); // FuncPtr is 一个指向函数的指针,该函数没有参数
// 返回值类型为void
FuncPtr funcPtrArray[10]; // funcPtrArray 是一个能容纳10个FuncPtrs指针的数组
让我们假设你希望(因为某些莫名其妙的原因)把一个指向下面函数的指针存入funcPtrArray数组:
int doSomething();
你不能不经过类型转换而直接去做,因为doSomething函数对于funcPtrArray数组来说有一个错误的类型。在FuncPtrArray数组里的函数返回值是void类型,而doSomething函数返回值是int类型。
funcPtrArray[0] = &doSomething; // 错误!类型不匹配
reinterpret_cast可以让你迫使编译器以你的方法去看待它们:
funcPtrArray[0] = reinterpret_cast<FuncPtr>(&doSomething); // this compiles
黑月亮 发表于 2005-10-1 21:57:00
C++的新型类型转换(造型Cast)
C++的新型类型转换共有四种方法代替传统的C造型(即(type)expression)
这四个操作符是, static_cast, const_cast, dynamic_cast, 和reinterpret_cast。在大多数情况下,对于这些操作符你只需要知道原来你习惯于这样写:(type) expression 而现在你总应该这样写:static_cast<type>(expression)
1.static_cast 与c转换功能一样,但不能把struct转换成int类型或者把double类型转换成指针类型,另外,static_cast不能从表达式中去除const属性(const_cast完成)
2.const_cast用于类型转换掉表达式的const或volatileness属性。通过使用const_cast,你向人们和编译器强调你通过类型转换想做的只是改变一些东西的constness或者 volatileness属性。
3.dynamic_cast,它被用于安全地沿着类的继承关系向下进行类型转换。这就是说,你能用dynamic_cast把指向基类的指针或引用转换成指向其派生类或其兄弟类的指针或引用,而且你能知道转换是否成功。失败的转换将返回空指针(当对指针进行类型转换时)或者抛出异常(当对引用进行类型转换时):
4.reinterpret_cast。它的类型转换,其的转换结果几乎都是执行期定义(implementation-defined)。因此,使用reinterpret_casts的代码很难移植。reinterpret_casts的最普通的用途就是在函数指针类型之间进行转换。例如,假设你有一个函数指针数组:
typedef void (*FuncPtr)(); // FuncPtr is 一个指向函数的指针,该函数没有参数
// 返回值类型为void
FuncPtr funcPtrArray[10]; // funcPtrArray 是一个能容纳10个FuncPtrs指针的数组
让我们假设你希望(因为某些莫名其妙的原因)把一个指向下面函数的指针存入funcPtrArray数组:
int doSomething();
你不能不经过类型转换而直接去做,因为doSomething函数对于funcPtrArray数组来说有一个错误的类型。在FuncPtrArray数组里的函数返回值是void类型,而doSomething函数返回值是int类型。
funcPtrArray[0] = &doSomething; // 错误!类型不匹配
reinterpret_cast可以让你迫使编译器以你的方法去看待它们:
funcPtrArray[0] = reinterpret_cast<FuncPtr>(&doSomething); // this compiles
相关文章推荐
- More Effective C++ 阅读笔记(四)-- 避免使用隐式类型转换
- more effective c++笔记1-----Item M2:尽 量使用C++风格的类型转换
- MoreEffective C++ 阅读笔记(一)---point 和 reference的区别
- More Effective C++ 阅读笔记(八)--“抛出一个异常”与“传递一个参数”或“调用一个虚函数”间的差异
- More Effective C++ 阅读笔记
- More Effective C++----(1)指针与引用的区别 & (2)尽量使用C++风格的类型转换 & (3)不要对数组使用多态
- Effective C#阅读笔记-3使用is或者as代替cast做类型转换
- 侯捷 more effective c++(WQ中文版) 阅读笔记1
- more effective c++ 第一章读书笔记: 指针,引用,c++类型转换,多态数组,默认构造函数
- More Effective C++ 阅读笔记(三)-- placement new操作符
- More Effective C++ 阅读笔记(十)--效率问题
- More Effective C++:类型转换
- more effective c++——Item M30 代理类(三)隐式类型转换与代理类
- More Effective C++ 阅读笔记(十一)--怎样让构造函数和非成员函数虚拟化
- More Effective C++:类型转换
- [More Effective C++]尽量使用C++风格的类型转换
- (大卫的阅读笔记)More Effective C++ Item 附2:一个auto_ptr的实现实例
- 利用重载避免隐式类型转换(More Effective C++_21(效率))
- C++学习笔记,显示类型强制转换,关键字static_cast
- More Effective C++ (条款21:利用重载技术避免隐式类型转换)