class String
{
public:
String(const char *str = NULL);
~String();
void print();
void operator =(const char*str);
void operator =(String str);
private:
char *m_str;
};
void String ::operator=(const char*str)
{
int len = strlen(str);
m_str = new char[len + 1];
strcpy_s(m_str, len + 1, str);
}
void String ::operator=(String str)
{
int len = strlen(str.m_str);
m_str = new char[len + 1];
strcpy_s(m_str, len + 1, str.m_str);
}
String::String(const char *str)
{
if (str == NULL)
{
m_str = new char[1];
m_str = '\0';
}
else
{
int len = strlen(str);
m_str = new char[len + 1];
strcpy_s(m_str,len+1,str);
}
}
String::~String()
{
cout << "析构"<<m_str<<endl;
if(m_str==NULL)
{
return;
}
delete[]m_str;
m_str = NULL;
}
void String::print()
{
cout<<m_str<<endl;
}
int main()
{
String s1("abcde");
s1.print();
s1 = "123456";
s1.print();
String s2 = "321";
s1 = s2;
s1.print();
return 0;
}
#include <iostream>
using namespace std;
class String
{
public:
String(const char *str = NULL);
String(const String& str)
{
int len = strlen(str.m_str);
m_str = new char[len + 1];
strcpy_s(m_str, len + 1, str.m_str);
}
~String();
void print();
void operator =(const char*str);
void operator =(String str);
private:
char *m_str;
};
void String ::operator=(const char*str)
{
int len = strlen(str);
m_str = new char[len + 1];
strcpy_s(m_str, len + 1, str);
}
void String ::operator=(String str)
{
int len = strlen(str.m_str);
m_str = new char[len + 1];
strcpy_s(m_str, len + 1, str.m_str);
}
String::String(const char *str)
{
if (str == NULL)
{
m_str = new char[1];
m_str = '\0';
}
else
{
int len = strlen(str);
m_str = new char[len + 1];
strcpy_s(m_str,len+1,str);
}
}
String::~String()
{
cout << "析构"<<m_str<<endl;
if(m_str==NULL)
{
return;
}
delete[]m_str;
m_str = NULL;
}
void String::print()
{
cout<<m_str<<endl;
}
int main()
{
String s1("abcde");
s1.print();
s1 = "123456";
s1.print();
String s2 = "321";
s1 = s2;
s1.print();
return 0;
}
void String ::operator=(String str); 这个函数参数不是引用类型 所以会调用函数的默认拷贝构造函数生成临时对象,由于你未实现拷贝构造函数所以存在深拷贝浅拷贝问题
s1=s2调用完后会释放临时变量就会调用析构函数,此时s2的成员变量m_str已经被释放了,所以main函数结束时s2生命周期结束调用析构函数会出现问题
而且在你重载等号的函数中应该要先释放之前的内存再new新内存
仅供参考,不敢保证一定对