关于构造函数和析构函数

2019-07-18  本文已影响0人  Justin_901e

构造函数与析构函数是类中特殊的成员函数,构造函数支持函数重载,而析构函数只能是一个无参函数。它们不可定义返回值,调用构造函数后,返回值为对象首地址,也就是this指针。

一、 构造函数的出现时机

对象生成时会自动调用构造函数。只要找到了定义对象的地方就找到了构造函数的调用实机,这看似简单,实际情况却相反,不同作用域的对象生命周期不同,如局部对象、全局对象、静态对象等的生命周期各不相同,而当对象作为函数参数与返回值时,构造函数的出现时机又会有所不同。

1,局部对象

      当对象产生时,便有可能引发构造函数的调用。

当进入对象作用域时,编译器会产生调用构造函数的代码。因此在调用过程中同样需要传递this指针。构造函数调用结束后,会将this指针作为返回值。返回this指针便是构造函数的特征之一。

2,堆对象

堆对象的申请需要使用malloc函数、new运算符或者其他同类功能函数。如:
CNumber *pNumber = new CNumber;

3,参数对象

参数对象属于局部对象的一各特殊对象。当对象作为函数参数时,调用一个特殊的构造函数--拷贝构造函数。该构造函数只有一个参数,类型为对象的引用。

4,返回对象

返回对象与参数对象相似,都是局部对象的一种特殊情况。当对象为参数时,在进入函数前使用拷贝构造函数,而返回对象则在函数返回时,使用拷贝构造函数。

5,全局对象与静态对象

  全局对象与静态对象的构造时机,在启动函数 mainCRTStartup中

二、析构函数的出现时机

1,局部对象

   当对象所在作用域结束后,将销毁作用域的所有变量的栈空间,此时便是析构函数的出现时机。

2,堆对象

    堆对象通过调用 delete时来调用析构函数。

3. 参数对象和返回对象

    只要函数的参数为对象类型,就会在函数调用结束后调用它的析构函数,然后释放掉参数对象所占的内存空间。

   当返回值为对象时:

这样的代码不是MyString在定义时赋初值,所以不会触发MyString拷贝构造函数。这时候会产生临时对象作为GetMyString的隐含参数。这个临时对象会在GetMyString内部完成拷贝构造函数过程。

4, 全局对象与静态对象

其函数中_cinit的第二个_initterm调用中被构造。它们的析构函数的调用 时机是在main函数执行完毕后。

上一篇下一篇

猜你喜欢

热点阅读