第十九节(构造函数、析构函数、复制构造函数)

C++ Primer plus第五版
第十章

C++中,程序在声明对象时将自动调用构造函数。
构造函数
第十九节(构造函数、析构函数、复制构造函数)_第1张图片
image.png

构造函数初始化对象的两种方式:
第一种:


image.png

第二种:

第十九节(构造函数、析构函数、复制构造函数)_第2张图片
image.png
第十九节(构造函数、析构函数、复制构造函数)_第3张图片
image.png

C++同Java一样,如果没有提供构造函数,那么会存在一个没有任何参数的默认构造函数

第十九节(构造函数、析构函数、复制构造函数)_第4张图片
image.png
第十九节(构造函数、析构函数、复制构造函数)_第5张图片
image.png

析构函数

析构函数完成对象的清理工作,在对象过期时会自动调用,例如,如果构造函数使用new来分配内存,则析构函数将使用delete来释放这些内存。
函数原型:

第十九节(构造函数、析构函数、复制构造函数)_第6张图片
image.png
第十九节(构造函数、析构函数、复制构造函数)_第7张图片
image.png

C++ Primer plus 第五版

第十二章

复制构造函数

这儿的sports是个已经初始化的StringBad对象

第十九节(构造函数、析构函数、复制构造函数)_第8张图片
image.png
第十九节(构造函数、析构函数、复制构造函数)_第9张图片
image.png
何时调用复制构造函数

每当程序生成了对象副本时,编译器都将使用复制构造函数。具体来说,当函数按值传递对象或者一个函数返回对象时,都将使用复制构造函数,按值传递意味着创建原始变量的一个副本,编译器生成临时对象时(比如将三个Vector对象相加时,编译器可能生成临时的Vector对象来保存中间结果)也将使用复制构造函数,何时生成临时对象随编译器而异,单无论哪种编译器,单按值传递和返回对象时,都将调用复制构造函数。

第十九节(构造函数、析构函数、复制构造函数)_第10张图片
image.png

复制构造函数执行流程:

第十九节(构造函数、析构函数、复制构造函数)_第11张图片
image.png

当ditto对象析构函数被调用时,将释放str指向的内存,这时候如果再用motto对象去访问str将发生错误。解决这个问题的办法是使用显式复制构造函数。

显式复制构造函数
image.png
第十九节(构造函数、析构函数、复制构造函数)_第12张图片
image.png
第十九节(构造函数、析构函数、复制构造函数)_第13张图片
image.png

你可能感兴趣的:(第十九节(构造函数、析构函数、复制构造函数))