C++下重写=号运算符解决浅拷贝问题
1 直接看代码就好,用一个类解决掉。
//#define _CRT_SECURE_NOWARNINGS
#pragma warning( disable : 4996) // 避免安全检查 一般超过2010版本的VS都会出现
#include<iostream>
using namespace std;
class Mystring {
public:
// 无参构造
Mystring() {
this->m_data = NULL;
}
// 有参构造(str不能设置为默认值,否则调用无参构造时会冲突)
Mystring(const char *str) {
this->m_data = (char*)malloc(strlen(str) + 1); // 加1是字符串自动补0
strcpy(this->m_data, str);
}
// 拷贝构造
Mystring(const Mystring &other){
this->m_data = (char*)malloc(strlen(other.m_data) + 1);
strcpy(this->m_data, other.m_data);
}
// 重写等号运算符
Mystring& operator=(Mystring &other){
// 1 如果是自身 返回自身
if (this == &other) {
return *this;
}
// 2 如果自己原来的内存没有释放 那就释放
if (this->m_data != NULL) {
delete this->m_data;
}
// 3 开始进行深拷贝
this->m_data = (char*)malloc(strlen(other.m_data) + 1);
strcpy(this->m_data, other.m_data);
// 4 返回自身
return *this;
}
char* GetData() {
if (this->m_data == NULL) {
cout << "m_data is NULL" << endl;
return (char*)"0";
}
return this->m_data;
}
~Mystring() {
if (this->m_data != NULL) {
delete this->m_data;
this->m_data = NULL;
}
}
private:
char *m_data;
};
int main() {
Mystring a;
cout << a.GetData() << endl;
Mystring b("123");
cout << b.GetData() << endl;
Mystring c(b);
cout << c.GetData() << endl;
Mystring d = c;
cout << d.GetData() << endl;
return 0;
}