美文网首页
关于构造函数和析构函数

关于构造函数和析构函数

作者: Justin_901e | 来源:发表于2019-07-18 12:28 被阅读0次

    构造函数与析构函数是类中特殊的成员函数,构造函数支持函数重载,而析构函数只能是一个无参函数。它们不可定义返回值,调用构造函数后,返回值为对象首地址,也就是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函数执行完毕后。

    相关文章

      网友评论

          本文标题:关于构造函数和析构函数

          本文链接:https://www.haomeiwen.com/subject/frnklctx.html