赋值操作符重载函数形参规格

赋值操作符重载函数形参规格

赋值操作符重载函数的形参基本都写为常量引用,返回值为引用。
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、判断实参和当前对象是不是同一个对象,如果是同一个就无需复制了,直接返回,调高效率。
另外对于包含指针成员的类,在定义赋值操作符重载函数时,不仅需要上述步骤还要注意不要造成内存的泄露。需要在分配新内存前释放自身已有的内存,另外对于判断实参和但却对象是不是同一个对象的要求就更加重要,没有这步则在释放当前对象自身内存的时候会造成严重错误:如果是同一对象,则释放了自身已有内存的同时也释放了实参的内存(因为是同一个),所以就找不到需要赋值的内容了,之后的操作就会出错。


©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页