ParentA func() {
ParentA a; return a;//先 拷贝构造a -------------(1) ;(2)----------- 接着析构a(非拷贝构造的a,而是上一句的a)
}
ParentA tmp;//调用默认构造函数构造tmp
tmp=func();// 调用赋值=构造函数,把(1)中拷贝构造的a 赋值给tmp,接着拷贝构造的a立马析构
ParentA tmp2=func();// tmp2 接管(1)中拷贝构造的a,不会析构 拷贝构造的a
tmp=func();//调用赋值=构造函数,把(1)中拷贝构造的a 赋值给tmp,接着拷贝构造的a立马析构
ParentA tmp2=func();// tmp2 接管(1)中拷贝构造的a,不会析构 拷贝构造的a,析构tmp2就是析构 拷贝构造的a,这一句比上一句少调用一次赋值构造函数,少调用一次析构
ParentA& func2() {
ParentA a=new ParentA();// ----------(1)构建堆上的a,没有析构释放内存
return *a;// 不会拷贝构造 a 的副本,就把a的引用返回,不会有构造函数调用
}
ParentA tmp1;//调用默认构造函数构造tmp
tmp1=func2();// 调用赋值=构造函数,把(1)中的a 赋值给tmp1,由于a是堆上的所以无法立马析构
ParentA &tmp2=func2();// tmp2 接管(1)中堆上的a,不会有构造函数调用
ParentA tmp3=func2();// 拷贝构造函数利用a的引用,构造tmp3.但是a在堆无法释放
ParentA tmp1;//调用默认构造函数构造tmptmp1=func2();// 调用赋值=构造函数,把(1)中的a 赋值给tmp1,由于a是堆上的所以无法立马析构
ParentA &tmp2=func2();// tmp2 接管(1)中堆上的a,不会有构造函数调用
ParentA tmp3=func2();// 拷贝构造函数利用a的引用,构造tmp3.但是a在堆无法释放