首页 > 代码库 > 第十九篇:复制控制( 下 ) --- 自定义析构函数
第十九篇:复制控制( 下 ) --- 自定义析构函数
前言
经过前两篇随笔( 上 中 )的分析我们已经解决了具有指针成员的同类对象“ 干涉 ”问题。可惜,前面给出的解决方案代码还是不完整。还有什么问题呢?观察发现,构造函数里面有new的关键字出现,也就是说开辟了新的内存空间,我们也知道new必须也只能对应一个delete,而不应该让系统自己处理( 还不熟练new和delete用法的点这里 ),但这里和new对应的delete去哪里了?
解决思路
应该何时delete?显然,应该在对象销毁的时候delete。C++中定义了这样一种函数 --- 析构函数,它与构造函数相对应,能在对象被销毁时自动执行。
对【复制控制( 中 )解决方案】的改进
下面的代码对【复制控制( 中 )解决方案】进行了进一步的改进 --- 设置了自定义的析构函数。至此,复制控制已经完全实现,我们可以正确效率地实现对象( 不论有无指针成员 )间的复制功能了:
1 #include <iostream> 2 #include <cstdlib> 3 #include <fstream> 4 #include <string> 5 6 using namespace std; 7 8 class A { 9 public:10 // 构造函数为指针成员开辟空间并赋初值011 A() {12 num_p = new int;13 *num_p = 0;14 }15 // 自定义复制函数 16 A(const A & a) {17 num_p = new int;18 *num_p = a.getNum();19 }20 // 自定义赋值运算符号21 A & operator=(const A & a) {22 num_p = new int;23 *num_p = a.getNum();24 }25 // 自定义析构函数26 ~A() {27 delete num_p;28 cout << "对象正常销毁" << endl;29 }30 // 给指针所指对象赋值31 void setNum(int num) {32 *num_p = num;33 } 34 // 获取指针所指对象35 int getNum() const {36 int num = *num_p;37 return num;38 }39 private:40 int *num_p;41 };42 43 int main()44 {45 A a1, a3;46 47 // 设置a1指针成员所指对象的值48 a1.setNum(1);49 // 调用自定义的复制函数50 A a2=a1;51 // 启用自定义的赋值运算符52 a3 = a1;53 // 观察得出a1,a2, a3的指针成员所指对象均为整数1。54 cout << "a1`s num: " << a1.getNum() << endl;55 cout << "a2`s num: " << a2.getNum() << endl;56 cout << "a3`s num: " << a3.getNum() << endl;57 58 // 修改a1指针成员所指对象的值59 a1.setNum(2);60 // 观察得出a1的指针成员所指对象改了,a2, a3的没变。 61 cout << "a1`s num: " << a1.getNum() << endl; 62 cout << "a2`s num: " << a2.getNum() << endl;63 cout << "a3`s num: " << a3.getNum() << endl;64 65 return 0;66 }
运行结果:
观察发现每个对象都使用了自定义的析构函数。
说明
一个有用的经验法则:如果类需要析构函数,它同时也需要自定义复制函数,重载赋值运算符。( 这就是C++中著名的“ 三法则 ” )
第十九篇:复制控制( 下 ) --- 自定义析构函数
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。