如果类需要析构函数,则它也需要赋值操作符和复制构造函数,这个规则常称为三法则。怎么理解呢?

问题来自C++primer中文版第四版413页,就是不理解为什么类需要析构函数它也需要赋值操作符(赋值操作函数)和复制构造函数,希望高手给予解答,最好举个例子来说明,万分... 问题来自C++primer中文版第四版413页,就是不理解为什么类需要析构函数它也需要赋值操作符(赋值操作函数)和复制构造函数,希望高手给予解答,最好举个例子来说明,万分感谢
还有就是有很多例子中都显式定义了析构函数,但也没见其定义赋值/复制构造函数,这又怎么理解呢?
展开
 我来答
xoalyg
2012-07-19 · TA获得超过4178个赞
知道大有可为答主
回答量:2356
采纳率:100%
帮助的人:2386万
展开全部
1、析构函数的主要功能是释放类实例中申请的动态空间,当不需要析构函数时,只需定义一个没有任何操作的析构函数,如~myclass() {}。不要以为这是“多此一举”,这是养成良好编程习惯的一方面。
2、如上所说,析构函数的主要功能是处理类实例中申请的动态内存,因为内存是有限资源,不需要的时候理应归还给系统,也许几k字节不会造成重大影响,但如果有众多这样的程序都这样做,累积的结果就有可能造成系统因内存不足而“行动缓慢”。
由于类的封装性,属性及方法在类内部是公用资源,使编程变得越发简单起来,析构函数也是方法之一,当类实例结束使命后,系统会自动调用析构函数,而不需要人为干预(是祸还是福?)。
3、当需要重载赋值操作符和复制构造函数时,必然需要申请动态内存,否则就不需要重载赋值操作符和复制构造函数了。
比如有这样一个类
class STRING {
private :
char *s;
public :
........
}
由于s是指针,编译后只会为保存指针而申请地址,并不会为将要存放的字符串申请空间,那么赋值构造函数中的操作是 STRING ms = "Primer C++ Plus";,为了存放字符串,就需要申请动态空间......,,这就是析构函数必须完成释放动态空间的工作,赋值操作符重载也有这样的要求。
匿名用户
2012-07-19
展开全部
1. 为什么需要析构函数
a.这个主要就是为了回收资源,比如你在对象里面动态分配了空间
malloc() 或者 new
在这个对象销毁的时候你要回收资源,那么free和delete就要写在析构函数中
b.此外,把析构函数定义为private还可以避免在栈上生成对象,这个是要用到单件的时候。

2.为什么需要拷贝或者赋值构造函数?
a.假设在你的类里面有一个指针
int *p = (int*)malloc(10);
那么在你拷贝这个对象的时候,如果使用了默认的拷贝构造函数,那么就只是拷贝了这个指针,而没有拷贝真正的数据,这个叫做浅拷贝,是非常危险的。比如你object1的方向改变了数据,那么拷贝的object2里面的数据也改变。
b.这个时候,我们就需要重写拷贝构造函数,构造一个新的内存区域,并且把新内存区域的值写为被拷贝区域的值,同时用一个指针指向这个区域。
这个叫深拷贝。

希望能帮到你,如果有问题的话可以继续提问,谢谢你
追问
谢谢你的帮忙  虽然你的回答和我的问题无关
追答
Judge it when you get it
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
suqian891106
2012-07-19 · TA获得超过217个赞
知道小有建树答主
回答量:465
采纳率:0%
帮助的人:124万
展开全部
好复杂
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式