在C++中,应使用自赋值检查来重载赋值运算符。
例如,考虑以下类别的Array和重载的赋值运算符函数,而无需进行自赋值检查。
// A sample class
class Array {
private:
int *ptr;
int size;
public:
Array& operator = (const Array &rhs);
// constructors and other functions of class........
};
// Overloaded assignment operator for class Array (without self
// assignment check)
Array& Array::operator = (const Array &rhs)
{
// Deallocate old memory
delete [] ptr;
// allocate new space
ptr = new int [rhs.size];
// copy values
size = rhs.size;
for(int i = 0; i < size; i++)
ptr[i] = rhs.ptr[i];
return *this;
}
如果我们有一个数组类型的对象比如A1,如果我们有像A1 = A1某处线,在不可预知的行为程序的结果,因为在上面的代码中没有自赋值检查。为避免上述问题,在使赋值运算符重载时,必须进行自我赋值检查。例如,以下代码进行自我分配检查。
// Overloaded assignment operator for class Array (with self
// assignment check)
Array& Array::operator = (const Array &rhs)
{
/* SELF ASSIGNMENT CHECK */
if(this != &rhs)
{
// Deallocate old memory
delete [] ptr;
// allocate new space
ptr = new int [rhs.size];
// copy values
size = rhs.size;
for(int i = 0; i < size; i++)
ptr[i] = rhs.ptr[i];
}
return *this;
}
参考:
http://www.cs.caltech.edu/courses/cs11/material/cpp/donnie/cpp-ops.html
要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程” 。