这个在面试中经常被问及的知识点,在此记录一下。
class String{
public:
String();
String(const char* str);
String(const String& other);
String& operator=(const String& other);
String& perator=(const char* str)
~String();
pravite:
char* m_data
}
String::String()
{
m_data=new char[1];
*m_data = '\0';
}
String::String(const char* str)
{
if(NULL == str){
m_data=new char[1];
*m_data = '\0';
}
else{
int len = strlen(str)+1;
m_data = new char[len];
memset(m_data, 0, len);
strcpy(m_data, str);
}
}
/*注意复制构造不允许值传递,不然就是复制构造函数内递归调用复制构造,无休止导致溢出*/
String::String(const String& other)
{
int len = strlen(other.m_data)+1;
m_data = new char[len];
memset(m_data, 0, len);
strcpy(m_data, other.m_data);
}
String& String::operator=(const String& other)
{
if(this == &other)
return *this;
if(NULL != m_data)
delete[] m_data;
int len = strlen(other.m_data) + 1;
m_data = new char[len];
strcpy(m_data, other.m_data);
return *this;
}
/*考虑异常安全性的做法*/
String& String::operator=(const String& other)
{
if(this != &other){
String strtemp(other);
char* ptemp=strtemp.m_data;
other.m_data = m_data;
m_data = ptemp;
}
return *this;
}
String::~String()
{
delete[] m_data;
}