#include <iostream> using namespace std; // 类内部指针成员的管理:引入原因,是当类内部有指针成员时的拷贝控制上有一些注意事项。 // 类可以实现所谓的“智能指针”行为,指针所指向的对象是共享的,但类能够防止悬垂指针 // 智能指针负责删除共享对象,需要一个析构函数来删除指针,但是,析构函数不能无条件地删除指针。 // 智能指针类将一个计数器与类指向的对象相关联。使用计数跟踪该类有多少个对象共享同一指针 // By Evel class Pt //计数类的定义 { friend class A; //申明友元 int *point; size_t num; Pt(int *p):point(p), num(1) {} //构造函数 ~Pt() { delete point; } }; class A { public: A(int* a, double b); //构造函数,调用到计数类 A(const A& ga):a1(ga.a1),a2(ga.a2) { ++a1->num; //访问私有成员a1并且自增指向 } A& operator=(const A&); //声明类操作符函数 ~A() { if(--a1->num==0) //如果是最后一个对象。 delete a1; } void set_dou(double sa){ a2 = sa;} //设置double成员 void set_pt(int *sp){ a1->point = sp;} //设置int*成员 int *get_pt() const {return a1->point;} //取得指针成员的值(一个地址),加const是为了不改变形参的值 double get_dou() const {return a2;} //取得double成员的值 int get_pt_val() const {return *a1->point;} //获得指针所指内容 void set_pt_val(int a) const {*a1->point = a;} //设置指针所指向的内容 private: Pt *a1; //指针形参a1.创建一个新的Pt对象,因此, double a2; }; A& A::operator=(const A& at) //定义类赋值操作符函数 { ++at.a1->num; if(--a1->num==0) delete a1; a1=at.a1; a2=at.a2; return *this; } A::A(int *a, double b) { a1=new Pt(a); a2=b; } void main() { /* int va=9; A t1(&va, 99.56); A t2(t1); //默认拷贝构造函数,逐个拷贝。T1和T2指针指向9 t1.set_dou(0); //重新设置double成员的值,T2的double会保持原来的值。但是int指针仍然指向同一个数9. cout << t2.get_dou() << endl; //输出99 cout << t1.get_dou() << endl; //输出0 //va=NULL; //va=0; t1.set_pt_val(35); //重新设置t1指针所指对象值(从9变成35) cout << t2.get_pt_val() << endl;//t2的指针同样受到t1指针值的影响。输出35 */ int *p1 = new int(50); A t3(p1,45.5); //构造新的对象t3 cout << t3.get_pt_val() << endl; //删除p1所指对象之前,t3中的指针和p1所指都是50 delete p1; cout << t3.get_pt_val() << endl; //当删除掉p1之后,t3中的指针成员悬垂,没有指向某个值; } 例子中似乎出现问题,编译没问题,但是运行会有问题,不知道为什么?