复制构造函数三次调用总结

/*分析下列程序的输出结果,并回答下列问题:
① 该程序中共调用过几次拷贝构造函数?是在什么情况下调用的拷贝构造函数?
// 1  用一个已知对象初始化一个正在被创建的对象  调用复制构造函数
// 2  函数形式参数为对象时 ,实参对象向形参对象传值  调用复制构造函数
// 3  函数的返回值时对象时 ,当需要获取返回值时 调用复制构造函数
② 临时对象是在何时被创建的?又在何时被释放?
//  临时对象时在 fun函数的return R;时被创建的,完成返回值的传递后,被系统释放
③ 临时对象起什么作用?
// 起到了值得暂存作用
*/
#include <iostream>
using namespace std;


class Tpoint1
{
  public:
	Tpoint1(int x,int y)//构造函数
	{ X=x; Y=y; }
	Tpoint1(Tpoint1 &p);//复制构造函数
	~Tpoint1( ) // 析构函数
	{ cout<<"Destructor called\n"; }
	int Xcoord( ) 
	{ return X; }
	int Ycoord( )
	{ return Y; }
  private:
	int X,Y;
};
Tpoint1::Tpoint1(Tpoint1 &p)//复制构造函数的实现
{
	X=p.X;
	Y=p.Y;
	cout<<"Copy-initialization Constructor called\n";
}

//普通函数
Tpoint1 fun(Tpoint1 Q)//2 Copy-initialization Constructor called  // 实参向形参传递参数会调用复制构造函数  传递参数的过程 Tpoint1 Q = N  实际也是用一个已知对象N初始化一个正在被创建的对象Q
{
	cout<<"ok\n";//3 ok
	int x=Q.Xcoord( )+10; //22
	int y=Q.Ycoord( )+15; //35
	Tpoint1 R(x,y);//
	return R;
	//4 Copy-initialization Constructor called 
	//R将要被系统回收时 系统会创建一个临时的无名对象获取R的值 实际过程是 Tpoint1 tmep = R; 实际也是用一个已知对象R初始化一个正在被创建的无名临时对象Temp
	//5 Destructor called  //析构R
	//6 Destructor called  //析构Q
	
}


int main( )
{
	Tpoint1 M(12,20),P(0,0),S(0,0);
	Tpoint1 N(M);// 1  Copy-initialization Constructor called    //调用第一次复制构造函数 用一个已知对象M初始化一个正在被创建的对象N
	P=fun(N);7 Destructor called //析构temp
	S=M;
	cout<<"P="<<P.Xcoord( )<<","<<P.Ycoord( )<<endl;//8 P=22,35
    cout<<"S="<<S.Xcoord( )<<","<<S.Ycoord( )<<endl;//9 S=12,20
	//10  Destructor called 
	//11  Destructor called
	//12  Destructor called
	//13  Destructor called
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值