赋值操作符重载函数形参规格
赋值操作符重载函数的形参基本都写为常量引用,返回值为引用。
class A
{
public:
A(int data = 0) : m_data(data) {}
~A() {}
A& operator=(const A& other)
{
if (this == &other)
{
return *this;
}
m_data = other.m_data;
return *this;
}
void print()
{
cout << m_data << endl;
}
private:
int m_data;
};
int main()
{
A a(1);
A b(2);
a.print();
b.print();
a = b;
a.print();
b.print();
A c = a;
c.print();
return 0;
}
1、返回值类型为该该类型的引用,并在函数结束返回对象本身的引用(*this),这样是为了允许连续赋值,如果返回void则不能进行连续赋值。
2、形参为常量引用,如果不是引用,在赋值是会调用拷贝构造函数,把参数声明为引用可以避免这样的消耗,提高代码效率。另外在赋值操作符重载函数内不会改变穿入对象的状态,因此为引用参数有添加了const,同时const还可以使得const对象可以作为实参(即赋值来源),因为const变量不能任意转换为非const变量。
3、判断实参和当前对象是不是同一个对象,如果是同一个就无需复制了,直接返回,调高效率。
另外对于包含指针成员的类,在定义赋值操作符重载函数时,不仅需要上述步骤还要注意不要造成内存的泄露。需要在分配新内存前释放自身已有的内存,另外对于判断实参和但却对象是不是同一个对象的要求就更加重要,没有这步则在释放当前对象自身内存的时候会造成严重错误:如果是同一对象,则释放了自身已有内存的同时也释放了实参的内存(因为是同一个),所以就找不到需要赋值的内容了,之后的操作就会出错。