什么是赋值函数
赋值函数是运算符"="重载,形式如下:
Test & operator=(const Test &obj);
为什么需要重载赋值函数
采用默认的赋值函数,若成员变量中有指针类型,赋值的时候需要进行深拷贝,默认的赋值函数只能浅拷贝,会导致两个对象的成员变量指针指向同一块内存。
- 默认赋值函数示例
#include <iostream>
using namespace std;
class Test
{
public:
Test()
{
cout << "Test ..." << endl;
}
void getData()
{
cout << "*pdata=" << *pdata << ", pdata=" << pdata << endl;
}
~Test()
{
cout << "~Test ..." << endl;
}
private:
int *pdata = new int(1);
};
int main()
{
Test a, b;
a = b;
a.getData();
b.getData();
return 0;
}
运行结果:两个指针指向同一块内存
Test ...
Test ...
*pdata=1, pdata=0x7b7f30
*pdata=1, pdata=0x7b7f30
~Test ...
~Test ...
- 重载赋值函数示例
#include <iostream>
using namespace std;
class Test
{
public:
Test()
{
cout << "Test ..." << endl;
}
Test & operator=(const Test &obj)
{
if (this != &obj)
{
*pdata = *(obj.pdata);
}
cout << "Test operator= ..." << endl;
return *this;
}
void getData()
{
cout << "*pdata=" << *pdata << ", pdata=" << pdata << endl;
}
~Test()
{
cout << "~Test ..." << endl;
}
private:
int *pdata = new int(1);
};
int main()
{
Test a, b;
a = b;
a.getData();
b.getData();
return 0;
}
运行结果:两个指针指向不同内存
Test ...
Test ...
Test operator= ...
*pdata=1, pdata=0x3a7f10
*pdata=1, pdata=0x3a7f30
~Test ...
~Test ...