More Effective C++之28
2006-07-18 21:15
489 查看
条款28 Smart Pointer(智能指针)
智能指针具有非常强大的能力,谨慎而明智的选择能带来极大的好处。我不否认智能指针的能力,虽然我在之前的否认过auto_ptr。可能由于我自身能力的限制,体会不到auto_ptr的好处,但这样的可能性我觉得已经不大了。但auto_ptr是最简单的智能指针,在它的周围存在大量的作品,这些作品包括Boost、Loki、ACE等等,但是可惜的是目前没有一个我能够说我很熟悉,那么本篇只是作为一个入门,在此基础上,应当阅读Boost、Loki、ACE相关源码。
Smart Pointer的核心是实现
template <class T>
T& SmartPointer<T>::operator*() const;
template <class T>
T& SmartPointer<T>::operator->() const;
Smart Pointer的构造和析构是一门艺术,由此而衍生出很多不同类型的Smart Pointer。千万不要指望Smart Pointer的表现象原生指针,虽然可以通过隐式转换来实现它,然而往往带来的后果是灾难性的。
Meyers给出了一个优雅的隐式转换的办法:
[align=left]template<class T>[/align]
[align=left]class TestTemplate[/align]
[align=left]{[/align]
[align=left]public:[/align]
[align=left] TestTemplate(T* ptr = 0):pointee(ptr){}[/align]
[align=left] template<class newType>[/align]
[align=left] operator TestTemplate<newType>()[/align]
[align=left] {[/align]
[align=left] return TestTemplate<newType>(pointee);[/align]
[align=left] }[/align]
[align=left]private:[/align]
[align=left] T* pointee;[/align]
};
可惜这样的程序在VC6中无法通过编译,似乎VC6不支持将novirtual member function声明成templates,但是VC7可以,呜呼。这里地方需要注意四点技术:(1)函数调用的自变量匹配规则、(2)隐式型别转换函数、(3)template functions的暗自具现化、(4)member function templates。我承认,这有点太深入了。
在智能指针中const和non-const之间的转化也是很大的学问,我看了Meyers使用unions来做实现。这不是我喜欢的做法,我觉得风险还是比较大的。
Smart Pointer值得使用么?这不是我可以回答的问题,然而在以往的经验中,我似乎很少用到。也许是我的孤陋造成了这样的局面,但在更深层次来说,我需要阅读更多的Smart Pointer的实现。而且更加重要的是需要学会对Smart Pointer的调试,这似乎并不简单。
智能指针具有非常强大的能力,谨慎而明智的选择能带来极大的好处。我不否认智能指针的能力,虽然我在之前的否认过auto_ptr。可能由于我自身能力的限制,体会不到auto_ptr的好处,但这样的可能性我觉得已经不大了。但auto_ptr是最简单的智能指针,在它的周围存在大量的作品,这些作品包括Boost、Loki、ACE等等,但是可惜的是目前没有一个我能够说我很熟悉,那么本篇只是作为一个入门,在此基础上,应当阅读Boost、Loki、ACE相关源码。
Smart Pointer的核心是实现
template <class T>
T& SmartPointer<T>::operator*() const;
template <class T>
T& SmartPointer<T>::operator->() const;
Smart Pointer的构造和析构是一门艺术,由此而衍生出很多不同类型的Smart Pointer。千万不要指望Smart Pointer的表现象原生指针,虽然可以通过隐式转换来实现它,然而往往带来的后果是灾难性的。
Meyers给出了一个优雅的隐式转换的办法:
[align=left]template<class T>[/align]
[align=left]class TestTemplate[/align]
[align=left]{[/align]
[align=left]public:[/align]
[align=left] TestTemplate(T* ptr = 0):pointee(ptr){}[/align]
[align=left] template<class newType>[/align]
[align=left] operator TestTemplate<newType>()[/align]
[align=left] {[/align]
[align=left] return TestTemplate<newType>(pointee);[/align]
[align=left] }[/align]
[align=left]private:[/align]
[align=left] T* pointee;[/align]
};
可惜这样的程序在VC6中无法通过编译,似乎VC6不支持将novirtual member function声明成templates,但是VC7可以,呜呼。这里地方需要注意四点技术:(1)函数调用的自变量匹配规则、(2)隐式型别转换函数、(3)template functions的暗自具现化、(4)member function templates。我承认,这有点太深入了。
在智能指针中const和non-const之间的转化也是很大的学问,我看了Meyers使用unions来做实现。这不是我喜欢的做法,我觉得风险还是比较大的。
Smart Pointer值得使用么?这不是我可以回答的问题,然而在以往的经验中,我似乎很少用到。也许是我的孤陋造成了这样的局面,但在更深层次来说,我需要阅读更多的Smart Pointer的实现。而且更加重要的是需要学会对Smart Pointer的调试,这似乎并不简单。
相关文章推荐
- 读书笔记MoreEffectiveC++(28)
- More Effective C++ 条款28(上)
- More Effective C++----(28)灵巧(smart)指针
- More Effective C++ 条款28 Smart Pointers(智能指针)
- More Effective C++ 条款28(中)
- More Effective C++ 条款28(下)
- More Effective C++ 读书摘要(五、技巧2)Item28 - 29
- More Effective c++ 28. Smart Pointer
- More Effective C++ 条款15 了解异常处理(exception handling)的成本
- More Effective C++ 条款16 谨记80-20法则
- More Effective C++ 条款21 利用重载技术避免隐式类型转换
- More Effective C++之8
- More Effective C++之15
- More Effective C++之16
- More Effective C++ 条款23 考虑使用其他程序库
- More Effective C++议题【四】:避免无用的缺省构造函数
- More Effective C++ 35 条款
- throw()使用小结:More effective C++:审慎使用异常规格(转),简单举例
- More Effective C++(条款10:在constructors内阻止资源泄露)
- 《More Effective C++》学习笔记(三)