智能指针 (2)

上一章:智能指针 (1)

目录

现在我们来看看上一节中智能指针实现的其中一个问题:智能指针的传递,当然这里所说的是值传递。

前面我们实现的三种方式:

        (1)不允许copy,那就是不允许传递;

        (2)深copy,开销很大;

        (3)浅copy,指针会多次被删除。

对于(1)(2)我们似乎没有办法改变之, 那么能否从(3)上想象办法?如何避免指针被多次删除?在这一章里, 我们就讲讲其中的一种方法。

在我们现实中, 我把某样物品给了你, 那么这物品就不属于我,而属于你了, 也就是所有权转移。我们可以利用这个思路运用到我们的copy构造函数和赋值运算符中:

智能指针 (2)_第1张图片
(1)

但是,这里面所有权转移从代码的形式上看,和普通的copy构造函数和赋值运算符并无差别,那么这样的代码随着维护时间的增加,出错的概率就会增加。我们须有明确的注释才能避免后人犯不必要的错误。在写代码的一个原则是,如果代码本身能表示含义,那么尽量就不要写注释。

因此顺着这个思路,我们可以换种方式,写一个特别的函数用于所有权转移,对于copy构造和赋值运算符还是不允许。那么代码就会变成如下所说:

智能指针 (2)_第2张图片
(2)

到这里,我们基本上已经实现了ownship转移的智能指针,一旦我们看到了getOwnershipFrom, 就知道这是overship转移的含义。

但是这个实现方式还是有一种问题,比如在函数参数的传递过程中,因为Disable了copy构造函数, 在参数传递前,每次必须新建一个对象,如下面的代码是无法通过编译的。

智能指针 (2)_第3张图片
(3)

因此上面两种方式鱼和熊掌不可兼得,但是从C++11之后,有了移动语意,实现右值引用构造函数和赋值运算符,通过move操作符,就可以替换掉getOwnershipFrom,实现两种方式的兼容。

智能指针 (2)_第4张图片
(4)

在运用中可以用如下的方式:

智能指针 (2)_第5张图片
(5)

至此,所有权转移的智能指针已经完成,下一篇会讲共享的智能指针。

下一章:智能指针 (3)

目录

你可能感兴趣的:(智能指针 (2))