包含指针的类需要特别注意复制控制,原因是复制指针时只是复制了指针中的地址,而不会复制指针指向的对象!
将一个指针复制到另一个指针时,两个指针指向同一对象。当两个指针指向同一对象时,可能使用任一指针改变基础对象。类似地,很可能一个指针删除了一对象时,另一指针的用户还认为基础对象仍然存在。指针成员默认具有与指针对象同样的行为。
大多数C++类采用以下三种方法之一管理指针成员:
1)指针成员采取常规指针型行为:这样的类具有指针的所有缺陷但无需特殊的复制控制!
2)类可以实现所谓的“智能指针”行为:通过对共享指针的对象进行计数,指针所指向的对象是共享的,但类能够防止悬垂指针。
3)类采取值型行为:每个对象在建立的时候,不管是初始化或者复制构造,指针所指向的对象是唯一的,有每个类对象独立管理。
1 常规指针:
- class HasPtr
- {
- public:
- HasPtr(int *p,int i):ptr(p),val(i) {} //构造函数
- ......
- private:
- int *ptr;
- int val;
- };
- int obj = 0;
- HasPtr ptr1(&obj,42);
- HasPtr ptr2(ptr1);
复制之后,int值是清楚且独立的,但是指针则纠缠在一起!
复制一个算术值时,副本独立于原版,可以改变一个副本而不改变另一个
复制指针时,地址值是可区分的,但指针指向同一基础对象。因此,如果在任意对象上调用set_ptr_val,则两者的基础对象都会改变
因为类直接复制指针,会使用户面临潜在的问题:HasPtr保存着给定指针。用户必须保证只要HasPtr对象存在,该指针指向的对象就存在: