再次论述C++ Class的构造器和析构器

第一次学习C++ CLass时仅对构造器和析构器有了一个初步的认识,“构造器在创建类对象时被自动调用,用来初始化对象中的成员;析构器在销毁对象时被自动调用,用于完成清理工作”,但这个还是停留在表面,比较浅显,对于一些概念的认识还很模糊。如今第二次学习,有了更深层次的认识和感受,写此文章来梳理一下,论述一下。

首先,类对象有两种:栈上对象和堆上对象。栈上对象就如同C语言中的栈上变量,一样;堆上对象就如同C语言中的堆上变量,一样。无非是,栈上对象由系统自动开辟空间和释放空间,堆上的对象要由程序员手动申请空间和销毁空间(C++中使用new/new【】和delete/delete【】)。由于栈对象的生命周期完全由系统控制,比较简单,不再论述。这里只论述一下堆对象。

对于堆对象来说,即常说的指针对象,Stu * pStu = new Stu ; delete PStu ; 。new用来开辟一个对象的空间,delete则用来销毁这个对象的空间。只有new才能触发构造器,只有delete才能触发析构器。

=》较个真儿:创建堆对象时,先new,开辟一个空间,然后触发构造器初始化成员;delete时,先触发析构器,清理工作,然后销毁空间。

=》再较个真儿:只有new出来一个空间,才能继续触发构造器进行初始化;只有delete先触发析构器进行清理工作,然后再销毁空间。

这段话是我第一次学习时的理解,也许存在错误。另外自己太较真儿了,但大可不必计较执行的先后顺序,即使认为是同时的应该也不为过。

可以看出,下划线这段话其实表述的很模糊。第二次学习时,自己有了一个更清晰的认识:要搞清楚,创建/开辟的是谁的空间,又为谁初始化?销毁的是谁的空间,又清理的是谁的空间?

创建/开辟的是类的实例——对象的空间,为其中的成员进行初始化,如果对象中有指针成员时,往往要为其再开辟一段堆内存。清理的是对象空间中的成员,主要是清理其中申请的堆内存,然后再销毁的是对象本身的空间。

讲到这里,忍不住为大家画一幅图,能让读者一目了然:

这个东西很像C语言中对于堆内存的层次化管理:申请时由外向内,释放时由内向外。如果理解了这个,再来理解析构器就不难了。这里其实就是一个是否存在两层内存的问题,有就用析构器来干掉里面那一层。本质上还是堆内存的层次化管理的思想。

那么,析构器是不是必须的?不是必须的。在对象中没有指针成员来开辟堆空间时,就不用析构器来清理了。使用系统默认提供的空体析构器就好,即什么都不做。如果对象中有指针成员,并为其开辟了堆内存,那么一定要自实现析构器来清理这部分堆空间。

最后再次强调:这里并不是针对对象本身的空间,无论是栈上的还是堆上的。针对的是对象空间中是否再次申请了堆内存,有则需要在析构器中delete掉。

PS:本人水平有限,有些理解和表述可能不是很准确,欢迎读者朋友提出批评意见,吾愿改之。希望能跟喜欢C/C++技术的朋友多交流!谢谢阅读!

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值