More Effective C++之智能指针

王朝c/c++·作者佚名  2008-06-01
宽屏版  字体: |||超大  

智能指针具有非常强大的能力,谨慎而明智的选择能带来极大的好处。我不否认智能指针的能力,虽然我在之前的否认过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给出了一个优雅的隐式转换的办法:

template<class T>

class TestTemplate

{

public:

TestTemplate(T* ptr = 0):pointee(ptr){}

template<class newType>

operator TestTemplate<newType>()

{

return TestTemplate<newType>(pointee);

}

private:

T* pointee;

};

可惜这样的程序在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的调试,这似乎并不简单。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
© 2005- 王朝网络 版权所有