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