Essential C++学习记录&笔记整理28(实现一个copy assignment operator)

还记得Essential C++学习记录&笔记整理22(什么是构造函数和析构函数)
提到的默认的成员逐一复制操作?对于那个Matrix类,里面包含了一个指针成员(私有成员),然而这个类我们声明两个对象,然后一个对象给另一个对象赋值,采用默认的成员逐一复制操作的话(即前者=后者;),就会让两个类的指针成员都指向一个堆里的动态数组,要是这两个类对象的析构函数都作用的话,前者析构对象作用后,delete掉了这个堆里的动态数组,那么,后者的指针成员就成了个野指针,显然这种方法就不对。
所以Matrix类需要一个拷贝构造函数和拷贝赋值运算符,那么拷贝构造函数我们在22里 提到过了,这里说一下拷贝赋值运算符的定义。

Matrix& Matirx::
operator=(const Matrix &rhs)//很像重载运算符一样
{
	if(this!=&rhs)//这里this指针指代"="左边的类对象。
	{//要是类对象间赋值(复制=右边的类对象所有public和private成员给
	//=左边的类对象),如果俩类对象都是一样的,那你=还有什么意义?
	//浪费时间(直接跳过if)。
		_row=rhs._row;
		_col=rhs._col;
		int elem_cnt=_row*_col;
		delete []_pmat;
		_pmat=new double[elem_cnt];
		//至于delete到new这两行,我的理解就是解除因=左边这个类对象
		//的构造函数让其指针成员指向了=右边的类对象里的new出来的数组
		//的这个指向。然后我让其指针成员指向自己new出来的数组,然后
		//给这个数组的所有元素赋值=右边的类对象new出来的数组的所有元素就可以了。
		//卧槽虽然看起来不像这个意思但是作者是这么想的。
		for(int ix=0;ix<elem_cnt;++ix)
		{
			_pmat[ix]=rhs._pmat[ix];
		}
	}
}
  • 所以,只要类的设计者明确提供了拷贝赋值运算符的定义,这个拷贝赋值运算符就会取代默认的成员逐一复制操作行为。但要重新编译一遍,客户端源代码不必更改。

你可能感兴趣的:(C++)