【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];
		}
	}
}

你可能感兴趣的:(C++基础,c++,开发语言,笔记)