【C++】了解拷贝构造函数

1、概念

只有一个形参,该形参是对本类类型对象的引用,一般用const来修饰,用已存在的类类型对象创建新对象时由编译器自动调用。

2、特征

class CGoods
{
public:
	/*CGoods()
	{}*/
	CGoods(const CGoods& rhs)
	{
		cout << this <<":CGoods::CGoods(char* , float , int )" << endl;
		_name = new char[strlen(rhs._name) + 1]();
		strcpy(_name, rhs._name);
		_price = rhs._price;
		_amount = rhs._amount;
	}
	CGoods(char* name, float price, int amount)
	{
		cout << this << ":CGoods::CGoods(char* , float , int )" << endl;
		_name = new char[strlen(name) + 1]();
		strcpy(_name, name);
		_price = price;
		_amount = amount;
	}
	~CGoods()
	{
		cout << this << ":~CGoods()" << endl;
		delete[] _name;
		_name = NULL;
	}
private:
	char* _name;
	float _price;
	int _amount;
};

int main()
{
	CGoods good1("good1", 500, 10);
	CGoods good2 = good1;
	return 0;
}

(1)拿一个已经存在的对象生成一个相同类型的新对象。
(2)相当于构造函数的一个重载形式。
(3)拷贝构造函数的参数必须使用引用形参,引用传值方式会引发无穷的递归调用。

  • 如果没有引用,编译器会这样进行
    在这里插入图片描述
  • 如果传的是引用,引用就是已存在的对象good1起一个别名rhs ,系统自带解引用,直接用rhs进行操作,不在调用构造函数。
    在这里插入图片描述
    (4)上面的代码,我们使用的是深拷贝进行,如果使用浅拷贝时,相当于两个指针指向了同一个堆内存,而在进行析构函数时会先释放good2 ,而good1生存周期到了之后调用析构就会导致释放一个野指针,程序崩溃。
    深拷贝就是重新开辟一块堆内存,把已存在的good1的东西拷贝过来。这样他们在释放时就不会相互影响。
CGoods(const CGoods& rhs)
	{
		_name = rhs._name;//浅拷贝
		_price = rhs._price;
		_amount = rhs._amount;
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值