#include "TestTempVar.h"
#include <iostream>
using namespace std;
namespace {
struct TempClass
{
TempClass() : privateCount(count) { ++count; cout << "TempClass " << privateCount <<" ctor" << endl; }
~TempClass() { cout << "TempClass " << privateCount << " dtor" << endl; }
TempClass(const TempClass& t)
{
privateCount = count++;
cout << "TempClass " << privateCount << " copy ctor" << endl;
}
TempClass& operator= (TempClass& t)
{
if (&t != this)
{
privateCount = count++;
}
cout << "TempClass " << privateCount << " operator=" << endl;
return *this;
}
private:
static int count;
int privateCount;
};
int TempClass::count = 1;
void testInput(TempClass& t)
{
cout << "testInput begin" << endl;
cout << "testInput return" << endl;
}
TempClass testReturn()
{
cout << "testReturn return" << endl;
return TempClass();
}
TempClass& testReturnRef()
{
cout << "testReturn return" << endl;
return TempClass();
}
}
void testTemporaryVariable()
{
cout << "TempClass();" << endl;
TempClass();
cout << "TempClass(); done" << endl << endl;
cout << "TempClass& t = TempClass();" << endl;
TempClass& t = TempClass();
cout << "TempClass& t = TempClass(); done" << endl << endl;
cout << "testInput(TempClass());" << endl;
testInput(TempClass());
cout << "testInput(TempClass()); done" << endl << endl;
cout << "TempClass result = testReturn();" << endl;
TempClass result = testReturn();
cout << "TempClass result = testReturn(); done" << endl << endl;
cout << "TempClass& refResult = testReturn();" << endl;
TempClass& refResult = testReturn();
cout << "TempClass& refResult = testReturn(); done" << endl << endl;
cout << "TempClass& refResult2 = testReturnRef();" << endl;
TempClass& refResult2 = testReturnRef();
cout << "TempClass& refResult2 = testReturnRef(); done" << endl << endl;
}
直接上代码和输出,大家就明白其中的原理了。
TempClass();
TempClass 1 ctor
TempClass 1 dtor
TempClass(); done
TempClass& t = TempClass();
TempClass 2 ctor
TempClass& t = TempClass(); done
testInput(TempClass());
TempClass 3 ctor
testInput begin
testInput return
TempClass 3 dtor
testInput(TempClass()); done
TempClass result = testReturn();
testReturn return
TempClass 4 ctor
TempClass result = testReturn(); done
TempClass& refResult = testReturn();
testReturn return
TempClass 5 ctor
TempClass& refResult = testReturn(); done
TempClass& refResult2 = testReturnRef();
testReturn return
TempClass 6 ctor
TempClass 6 dtor
TempClass& refResult2 = testReturnRef(); done
TempClass 5 dtor
TempClass 4 dtor
TempClass 2 dtor