Go homepage(回首页)
Upload pictures (上传图片)
Write articles (发文字帖)

The author:(作者)delv
published in(发表于) 2014/1/8 7:03:00
More,Effective,C++之智能指针_[Asp.Net教程]

More Effective C++之智能指针_[Asp.Net教程]

智能指针具有非常强大的能力,谨慎而明智的选择能带来极大的好处。我不否认智能指针的能力,虽然我在之前的否认过auto_ptr。可能由于我自身能力的限制,体会不到auto_ptr的好处,但这样的可能性我觉得已经不大了。但auto_ptr是最简单的智能指针,在它的周围存在大量的作品,这些作品包括Boost、Loki、ACE等等,但是可惜的是目前没有一个我能够说我很熟悉,那么本篇只是作为一个入门,在此基础上,应当阅读Boost、Loki、ACE相关源码。

  Smart Pointer的核心是实现


template
T& SmartPointer::operator*() const;
template
T& SmartPointer::operator->() const;
  Smart Pointer的构造和析构是一门艺术,由此而衍生出很多不同类型的Smart Pointer。千万不要指望Smart Pointer的表现象原生指针,虽然可以通过隐式转换来实现它,然而往往带来的后果是灾难性的。

  Meyers给出了一个优雅的隐式转换的办法:


template
class TestTemplate
{
public:
TestTemplate(T* ptr = 0):pointee(ptr){}
template
operator TestTemplate()
{
return TestTemplate(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的调试,这似乎并不简单。


作者:韩羽 来源:blog






If you have any requirements, please contact webmaster。(如果有什么要求,请联系站长)





QQ:154298438
QQ:417480759