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