C++实用技巧(三)(二)
2014-11-24 12:57:03
·
作者:
·
浏览: 5
counter=p.counter;
13 Increase();
14 }
15 return *this;
16 }
在上一篇文章有朋友指出重载operator=的时候需要考虑是不是自己赋值给自己,其实这是很正确的。我们写每一类的时候,特别是当类拥有自己控制的资源的时候,需要非常注意这件事情。当然如果只是复制几个对象而不会new啊delete还是close什么handle,那检查不检查也无所谓了。在这里我们非常清楚,当增加一个新的非空智能指针的时候,引用计数的总和会加一。当修改一个非空智能指针的结果也是非空的时候,引用计数的和保持不变。当然这是应该的,因为我们需要在所有非空智能指针都被毁掉的时候,释放受保护的所有资源。
到了这里一个智能指针基本上已经能用了,但是还不能处理父类子类的情况。这个是比较麻烦的,一个Ptr事实上没有权限访问Ptr的内部对象。因此我们需要通过友元类来解决这个问题。现在让我们来添加两个新的函数吧,从一个任意的Ptr复制到Ptr,然后保证只有当C*可以隐式转换成T*的时候编译能够通过:
1 template friend class Ptr;
2
3 template
4 Ptr(const Ptr& p):pointer(p.pointer)