关于C++函数返回值的使用方式以及局部对象何时析构的问题
关于C++局部对象何时析构的探讨:
我之前一直笼统的认为局部在函数调用结束之后,所有的局部变量会立刻析构,经过仔细分析之后才发现还有很多细节。
这里对比了函数返回值的使用:
Test t;
t = fun(); //赋值
和:
Test t = fun(); //初始化
假设有一个类Test:
函数fun()、fun1()定义及其调用和输出结果过程如下:
可以看到fun1()的t首先构造,接着执行fun()构造tmp1、tmp,在fun()调用结束之后首先析构tmp1,再调用t的赋值操作符函数将fun()返回值tmp赋给t。接着析构tmp。最后在fun()1结束之后析构t。这个过程中fun()的局部变量在其调用结束后就进行了析构(虽然tmp1、tmp的析构顺序并没有按先进后出的顺序)。
fun2()定义及其调用和输出结果过程如下:
一般的想法在fun2()中Test t = fun(); 认为t会调用拷贝构造函数将fun()返回值作为实参进行构造。然而实际并不是如此。t并没有进行构造!
输出结果显示fun()函数的局部变量tmp1、tmp首先进行了构造,在该函数结束时tmp1被析构调了,作为返回值的tmp并没有被析构,而是直接变成了t在fun2()继续存在。在fun2()函数结束时才被析构。