2022.6.14 C++——拷贝构造函数

23 篇文章 0 订阅

1. 回顾构造函数

用代码分析

class Complex
{
private:
	double Real;
	double Image;
public:
	Complex() :Real{}, Image{}  //缺省的构造函数
	{
		cout << "Create Object() " << this << endl;
	}
	Complex(double r, double i) :Real{ r }, Image{ i }//带参数的构造函数
	{
		cout << "Create Object(double,double) " << this << endl;
	}
	~Complex()//析构函数,不带任何参数,无类型
	{
		cout << "Destroy Object " << this << endl;
	}
	void Print() const
	{
		cout << " Real= " << Real << " Image= " << Image << endl;
	}
};
int main()
{
	Complex ca;
	ca.Print();
	Complex cb(1.2, 2.3);
	cb.Print();

	return 0;
}

运行结果:
在这里插入图片描述
分析:从运行结果可以看出,进入主函数,运行Complex ca时,调用的是缺省的构造函数,运行Complex cb(1.2, 2.3)时,调用的是带参数的构造函数,然后调用析构函数,但是析构函数的调用首先是析构带参数的构造函数,最后析构缺省的构造函数。
那么,在主函数中,Complex cc(cb),这个程序会执行成功吗,这就有了拷贝函数的概念产生。

2. 拷贝构造函数

拷贝函数定义:同一个类的对象在内存中有完全相同的结构,如果作为一个整体进行复制或称拷贝是完全可行的。这个拷贝过程只需要拷贝数据成员,而函数成员是共用的(只有一份拷贝)。在建立对象时可用同一类的另一个对象来初始化该对象的存储空间,这时所用的构造函数称为拷贝构造函数。
作用:
在程序运行时,如果一个对象去初始化另一个对象时,就得调用拷贝构造函数。

2.1 认识拷贝构造函数

示例:

class Complex
{
private:
	double Real;
	double Image;
public:
	Complex() :Real{}, Image{}  //缺省的构造函数
	{
		cout << "Create Object() " << this << endl;
	}
	Complex(double r, double i) :Real{ r }, Image{ i }//带参数的构造函数
	{
		cout << "Create Object(double,double) " << this << endl;
	}
	Complex(const Complex& com) :Real{com.Real}, Image{ com.Image }
	{
		cout << "Copy Create" << this << endl;
	}
	~Complex()//析构函数,不带任何参数,无类型
	{
		cout << "Destroy Object " << this << endl;
	}
	void Print() const
	{
		cout << " Real= " << Real << " Image= " << Image << endl;
	}
};
int main()
{
	Complex ca;
	ca.Print();
	Complex cb(1.2, 2.3);
	cb.Print();
	Complex cc(cb);
	cc.Print();

	return 0;
}

运行结果:
在这里插入图片描述
结果分析:从运行结果来看,在上述程序的基础上,添加了一个拷贝构造函数,拷贝构造函数的用法——是在程序运行中,一个对象去初始化另一个对象时,就得调用拷贝构造函数,调用析构函数时的顺序与构造函数时相反的。

2.2 实现缺省的拷贝构造函数

示例:

const int len = 20;
class CGoods
{
private:
	char Name[len];
	int Amount;
	float Price;
	float Total;
public:
	CGoods()  //缺省的构造函数
	{
		memset(Name, 0, sizeof(Name));
		Amount = 0;
		Price = 0.0;
		Total = 0.0;
		cout << "Create Object() " << this << endl;
	}
	CGoods(const char* name, int a, float p)//带参的构造函数
	{
		strcpy_s(Name, len, name);
		Amount = a;
		Price = p;
		Total = Amount * Price;
		cout << "Create Object(char,int,float) " << this << endl;
	}
	CGoods(const CGoods& cs)
	{
		strcpy_s(Name, len, cs.Name);
		Amount = cs.Amount;
		Price = cs.Price;
		Total = cs.Total;
		cout << "Copy Create" << this << endl;
	}
	~CGoods()//析构函数,不带任何参数,无类型
	{
		cout << "Destroy Object " << this << endl;
	}
};
int main()
{
	CGoods ca;
	CGoods cb("biyadi", 10, 100000);
	CGoods cd(cb);

	return 0;
}

其中在这里插入图片描述
运行结果:
在这里插入图片描述
从运行结果可以看出,用对象cb去初始化对象cd时,会调用拷贝构造函数。

2.3 类类型作为函数的形参

类类型作为函数的形参,有三种传递方式,值传递,引用传递,常引用传递,void funb(CGoods co),void func(CGoods &co),void fund(const CGoods& co),在我们传递我们的引用时,调用函数func,传递我们的引用不允许改变时,调用fund。

2.4 类类型作为函数的返回值

const int len = 20;
class CGoods
{
private:
	char Name[len];
	int Amount;
	float Price;
	float Total;
public:
	CGoods()  //缺省的构造函数
	{
		memset(Name, 0, sizeof(Name));
		Amount = 0;
		Price = 0.0;
		Total = 0.0;
		cout << "Create Object() " << this << endl;
	}
	CGoods(const char* name, int a, float p)//带参的构造函数
	{
		strcpy_s(Name, len, name);
		Amount = a;
		Price = p;
		Total = Amount * Price;
		cout << "Create Object(char,int,float) " << this << endl;
	}
	CGoods(const CGoods& cs)
	{
		strcpy_s(Name, len, cs.Name);
		Amount = cs.Amount;
		Price = cs.Price;
		Total = cs.Total;
		cout << "Copy Create" << this << endl;
	}
	~CGoods()//析构函数,不带任何参数,无类型
	{
		cout << "Destroy Object " << this << endl;
	}
};
CGoods get()
{
	CGoods dt("biyadi", 10, 100000);
	return dt;
}
int main()
{
	CGoods ca;
	ca = get();

	return 0;
}

运行结果:
在这里插入图片描述
分析结果:在程序运行时,进入主程序,首先调用的是缺省的构造函数,然后执行程序,到ca = get();,调用get函数,进入get函数后,CGoods dt(“biyadi”, 10, 100000);调用的是带参的构造函数,然后再调用拷贝构造函数,这在中间会产生一个将亡值,析构时候,先析构带参的构造函数,再析构拷贝构造函数,最后析构缺省的构造函数。

2.5 拷贝构造函数总结

拷贝构造函数的参数——采用引用,如果把一个真实的类对象作为参数传递到拷贝函数,会引起无穷递归,如
在这里插入图片描述
在类中如果没有显式给出拷贝函数时,则C++编译器自动给出一个缺省的拷贝构造函数,如果有程序设计者定义的构造函数(包括拷贝构造函数),则按函数重载的规律,调用合适的构造函数。
注意:缺省的拷贝构造函数特点:按位拷贝

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值