C++之构造函数,拷贝构造,析构函数再剖析

我们已经了解了构造函数,析构函数基本用法,创建一个对象,我们可以调用构造函数进行初始化,要是我们用已知的对象去创建另一个对象呢?
例如:

Tpoint d1(3,5);
Tpoint d2(d1);//考虑考虑

由一个对象初始化另一个对象,系统会调用拷贝构造函数或者默认拷贝构造函数
拷贝构造函数
1:名字与类同名,并且不被指定返回类型
2:只有一个参数,并且为类对象的引用
3:格式

<类名> :: <拷贝构造函数名> (<类名>& <引用名>)
{    }
拷贝构造函数名与类同名
<类名> :: <拷贝构造函数名> (<类名> <引用名>)//无引用时传值会创建
                                      //临时对象,临时对象会调 用拷贝构造函数形成无穷递归
            
{    }
拷贝构造函数名与类同名

从下面代码分析:

class  Tpoint
{
public :
	 Tpoint(int x, int y);//自定义的构造
	 Tpoint(const Tpoint& p);//拷贝构造类内声明
	 Tpoint()
	 {
		 cout << "默认构造" << endl;
	 }
	/*void SetPoint(int x,int y);*/
	int Xcoord()
	{
		return X;
	}
	int Ycoord()
	{
		return Y;
	}
     ~Tpoint()//析构函数
	{
		cout << X <<"   "<< Y << " 析构 " << endl;
	}

private:
	int X;
	int Y;
};
 Tpoint:: Tpoint(int x, int y)
{
	X = x;
	Y = y;
	cout << "自定义构造" << endl;

}
Tpoint::Tpoint(const Tpoint& p)//拷贝构造函数
{
	X = p.X;
	Y = p.Y;
	cout << "Copy_构造" << endl;
}
Tpoint fun(Tpoint w);
Tpoint fun(Tpoint w)//对象作为函数形参  (实参初始化形参调用拷贝构造函数赋初值)
{
	cout << "shican" << endl;
	int x;
	int y;
	x = w.Xcoord() + 10;
	y = w.Ycoord() + 20;
	Tpoint R(x, y);//调用自定义构造函数创建临时对象
	return R;//调用拷贝构造函数创建临时对象来保存R数据,该对象是无名的,(匿名对象)
	         //在执行完 Tpoint P = fun(d5)时,内容已经赋值给P,然后临时对象被释放,
	        
}
int main()
{
	Tpoint d1(12,20), d2(0,0), d3(3,3);
	Tpoint d4(2, 3);
	Tpoint d5(d4);
	Tpoint P = fun(d5);
	d2 = d3; 
	cout << d5.Xcoord() << " " << d5.Ycoord() << endl;
	cout << P.Xcoord() <<" "<< P.Ycoord() << endl;
	cout << d2.Xcoord() <<" "<< d2.Ycoord() << endl;
}

这里写图片描述
从程序运行结果来看,

Tpoint d5(d4);//一个对象初始化另一个对象,系统会调用拷贝构造函数
Tpoint P = fun(d5);
Tpoint fun(Tpoint w)//对象作为函数形参  (实参d5初始化形参w调用拷贝构造函数赋初值)
{
	cout << "shican" << endl;
	int x;
	int y;
	x = w.Xcoord() + 10;
	y = w.Ycoord() + 20;
	Tpoint R(x, y);//调用自定义构造函数
	return R;//调用拷贝构造函数创建临时对象来保存R数据,该对象是无名的,(匿名对象)
	         //在执行完 Tpoint P = fun(d5)时,内容已经赋值给P,然后临时对象被释放,
}

临时对象所起的作用详情:
这里写图片描述

void fun( const Tpoint w)//调用类的拷贝构造函数进行值传递
void fun( const Tpoint& w) //不会调用拷贝构造函数
Tpoint fun( const Tpoint& w)//传参时不会调用
{
      .......
      return d;//返回时会调用拷贝构造函数生成临时对象
}
Tpoint& fun( const Tpoint& w)//不会调用拷贝构造函数
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值