1、先释放旧的内存
2、返回一个引用
3、赋值
//示意图
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
#include <string>
class Name
{
public:
Name(const char* myp)
{
int len = strlen(myp);
m_p = (char*)malloc(len + 1);
strcpy(m_p, myp);
}
//Name obj2 = obj1;
//解决方案: 手工的编写拷贝构造函数 使用深拷贝
Name (const Name& obj1)
{
m_len = obj1.m_len;
m_p = (char*)malloc(m_len + 1);
strcpy(m_p, obj1.m_p);
}
Name& operator=(Name &obj1)
{
//1 把旧的内存先释放掉
if (this->m_p != NULL)
{
delete[] m_p; //这里不明白 ,看书去
m_len = 0;
}
//2 根据obj1分配内存大小
this->m_len = obj1.m_len;
this->m_p = new char[m_len+1];
//把obj1赋值
strcpy(m_p,obj1.m_p);
return *this;
}
~Name()
{
if (m_p != NULL)
{
free(m_p);
m_p = NULL;
m_len = 0;
}
}
private:
char *m_p;
int m_len;
};
void objplaymain()
{
Name obj1("abcdefg");
//Name obj2 = obj1; //默认的copy函数 C++编译器给我们提供的
//初始化
Name obj2=obj1;
Name obj3("obj3"); //等号操作 初始化和等号操作是两个不同的概念
//显示的重载等号操作符
obj3 = obj1; //C++编译器提供的 等号操作 也属 浅拷贝
//obj3.operator=(obj1)
//3
obj1 = obj2 = obj3;
//obj2.operator=(obj3)
//obj1 = void;
}
int main()
{
cout << "你好:" << endl;
objplaymain();
return 0;
}