一、
class Test
{
public:
Test(int a=5):ma(a){cout<<"Test(int)"<<this<<endl;}
~Test(){cout<<"~Test()"<<this <<endl;}
Test(const Test &src):ma(src.ma)
{cout<<"Test(const Test&)"<<this<<endl;}
void operator=(const Test &src)
{
ma = src.ma;
cout<<"operator="<<endl;
}
int GetValue(){return ma;}
private:
int ma;
};
Test GetTestObject(Test &t)//按引用传递
{
int value = t.GetValue();
Test tmp(value);
return tmp;
}
int main()
{
Test t1(20);//构造t1
Test t2;//构造t2
t2 = GetTestObject(t1);//进入函数构造tmp,拷贝构造tmp的临时对象,析构tmp,赋值构造t2,析构临时对象,析构t2,析构t1
cout<<t2.GetValue()<<endl;
return 0;
}
运行结果如下:
二、
class Test
{
public:
Test(int a=5, int b=5):ma(a), mb(b)
{cout<<"Test(int, int)"<<this<<this->ma <<endl;}
~Test()
{cout<<"~Test()"<<this<<endl;}
Test(const Test &src):ma(src.ma), mb(src.mb)
{cout<<"Test(const Test&)"<<this<<this ->ma <<endl;}
void operator=(const Test &src)
{ma = src.ma; mb = src.mb; cout<<"operator="<<this<<this->ma <<endl;}
private:
int ma;
int mb;
};
Test t1(10, 10);//构造t1
int main()
{
Test t2(20, 20);//构造t2
Test t3=t2;//拷贝构造t3
static Test t4 = Test(30, 30);//构造t4
t2 = Test(40, 40);//构造临时对象,临时对象赋值t2,析构临时对象,
t2 = (Test)(50, 50);//构造临时对象,临时对象赋值t2,析构临时对象,
t2 = 60;//隐式构造临时对象,临时对象赋值t2,析构临时对象,
Test *p1 = new Test(70, 70);//构造临时对象
Test *p2 = new Test[2];//构造两个临时对象
Test *p3 = &Test(80, 80);//构造临时对象,析构临时对象
Test &p4 = Test(90, 90);//构造临时对象
delete p1;//析构p1指向的临时对象
delete []p2;//析构两个p2指向的临时对象
}
Test t5(100, 100);//构造t5
/*析构p4指向的临时对象
析构t3
析构t2;
析构t4
析构t5
析构t1*/
三、
class Test
{
public:
Test(int a=5):ma(a){cout<<"Test(int)"<<this<<endl;}
~Test(){cout<<"~Test()"<<this<<endl;}
Test(const Test &src):ma(src.ma)
{cout<<"Test(const Test&)"<<this<<endl;}
void operator=(const Test &src)
{
ma = src.ma;
cout<<"operator="<<&src<<endl;
}
int GetValue(){return ma;}
private:
int ma;
};
Test GetTestObject(Test t)//先拷贝构造t1的临时对象,因为是按值传递 三
{
int value = t.GetValue();
Test tmp(value);//构造tmp 四
return Test(value);//构造临时对象(假设叫做p1),析构tmp,析构t1的临时对象 五
}
int main()
{
Test t1(20);//构造t1 一
Test t2;//构造t2 二
t2 = GetTestObject(t1);//临时对象(p1)赋值t2,析构临时对象(p1) 六
cout<<t2.GetValue()<<endl;//析构t2,析构t1 七
return 0;
}
四、总结: