1.前面已经叙述过浅拷贝的问题,当类成员含有指针时,可以通过显示编写拷贝构造函数的方法,实现用一个类初始化另一个类的深拷贝。
2.但是如果是赋值运算,即例子中的 obj2 = obj1,则不会调用拷贝构造函数,这个时候需要通过重载 = 运算符的方式实现深拷贝,
步骤已经在代码注释中提出。
#include "iostream"
using namespace std;
class Location
{
public:
Location(char *p) //一个参数的构造函数
{
m_len = strlen(p);
m_p = (char *)malloc(m_len + 1);
strcpy(m_p, p);
}
/*
Location(const Location &obj) //深拷贝 拷贝构造函数 显示编写
{ //如果不显示编写,将会调用默认的拷贝构造函数进行浅拷贝
m_len = obj.m_len; // 下面用重载=运算符的方式实现深拷贝
m_p = (char *)malloc(m_len + 1);
strcpy(m_p, obj.m_p);
}
*/
void prinT()
{
cout << m_p << endl;
}
Location & operator=(Location &obj1) // 重载= 运算符 ,实现深拷贝。
{
//1. 先把原来指向的空间释放,长度置0
if (this->m_p != NULL)
{
delete[] this->m_p;
this->m_len = 0;
}
//2. 按照obj1的长度给obj2分配空间
this->m_p = new char[obj1.m_len + 1];
//3. 将obj1内容拷贝给obj2
strcpy(this->m_p, obj1.m_p);
//4. 为了支持链式编程,返回引用, 因为=操作符的结合顺序是从右向左的
return *this;
}
private:
char *m_p;
int m_len;
};
void main()
{
Location obj1("zhangwentao");
Location obj2 ("obj2");
Location obj3("hhhhh");
obj3 = obj2 = obj1;
obj1.prinT();
obj2.prinT();
obj3.prinT();
system("pause");
}