C++ primer智能指针(HasPtr)实现 (二)

2014-11-24 02:32:52 · 作者: · 浏览: 4

val = rhs.val;
return *this;
做完赋值操作后,那么就成为如下图所示了。红色标注的就是变化的部分:

\


而还要注意的是,重载赋值操作符的时候,一定要注意的是,检查自我赋值的情况。

如图所示:

\


此时,做p1 = p1的操作。那么,首先u1.use自增1,为2;然后,u1.use自减1,为1。那么就不会执行delete操作,剩下的操作都可以顺利进行。按《C++ primer》说法,“这个赋值操作符在减少左操作数的使用计数之前使rhs的使用计数加1,从而防止自身赋值”。哎,反正我是那样理解的。当然,一来就可以按常规那样:


[cpp]
if(this == &rhs)
return *this;


运行结果:

U_ptr constructor called !
HasPtr constructor called ! use = 1
HasPtr copy constructor called ! use = 2
HasPtr copy constructor called ! use = 3
HasPtr copy constructor called ! use = 4
0 0
10000 10000
10 10
HasPtr distructor called ! use = 4
HasPtr distructor called ! use = 3
HasPtr distructor called ! use = 2
10
HasPtr distructor called ! use = 1
U_ptr distructor called !