【C++】class的设计与使用(八)复制构造函数、复制赋值运算符

回顾【C++】class的设计与使用(二)构造函数和析构函数

成员逐一初始化
当在默认情形下,我们以某个类对象作为另外一个类对象的初值:

Triangular tri1(8);
Triangular tri2=tri1;

默认的成员逐一初始化操作:
类成员会被依次复制:Triangular类的_length,_beg_pos,_next都会依次从tri1复制到tri2。

复制构造函数可以改变默认的成员逐一初始化操作:

Matrix::Matrix(const Matrix &rhs)
	:_row(rhs._row),_col(rhs._col)
{
	int elem_cnt=_row*_col;
	_pmat=new double[elem_cnt];
	
	for(int ix=0;ix<elem_cnt;++ix)
	{
		_pmat[ix]=rhs._pmat[ix];
	}
}

提供拷贝赋值操作符

对于Matrix类我们声明了两个对象,其中一个对象给另一个对象赋值,采用默认的成员逐一复制操作,即(前者=后者;),就会让两个指针成员指向一个堆里的动态数组,当这两个类对象的析构函数都作用,前者析构对象作用后,这个堆里的动态数组delete,后者的指针成员就失去指向对象了,显然有误。

Matrix类需要一个复制构造函数和复制赋值运算符
只要类的设计者明确提供了复制赋值运算符的定义,这个复制赋值运算符就会取代默认的成员逐一复制操作行为。

Matrix& Matirx::operator=(const Matrix &rhs)//类似重载运算符
{
	if(this != &rhs)
		_row=rhs._row;
		_col=rhs._col;
		int elem_cnt=_row*_col;
		delete []_pmat;
		_pmat=new double[elem_cnt];

		for(int ix=0;ix<elem_cnt;++ix)
		{
			_pmat[ix]=rhs._pmat[ix];
		}
	}
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值