题目
经典的面试题,题目如下:
class String
{
public:
String(const char *str = NULL);// 普通构造函数
String(const String &other); // 拷贝构造函数
~ String(void); // 析构函数
String & operate =(const String &other);// 赋值函数
private:
char *m_data;// 用于保存字符串
};
参考:http://www.cnblogs.com/stoneJin/archive/2011/11/01/2231358.html
https://www.nowcoder.com/questionTerminal/d480ff83e1594b9fbd74bb102094a493
自己写了一遍,能通过
代码
#include <iostream>
#include <assert.h>
using namespace std;
class String
{
public:
String(const char* str = NULL);
String(const String &other);
~String();
String &operator= (const String &other);
private:
char *m_data;
};
String::String(const char* str)
{
if (str == NULL)
{
m_data = new char[1];
assert(m_data != NULL);
m_data = '\0';
}
else
{
int len = strlen(str);
m_data = new char[len];
assert(m_data != NULL);
//memcpy(m_data, str, len); // 法1
strcpy(m_data, str);
}
}
String::String(const String &other)
{
assert(this != &other);
int len = strlen(other.m_data);
m_data = new char[len];
assert(m_data != NULL);
strcpy(m_data, other.m_data);
}
String::~String(void)
{
delete[] m_data;
m_data = NULL;
}
String& String::operator=(const String &other)
{
if (this == &other)
{
return *this;
}
delete[] m_data;
m_data = NULL;
int len = strlen(other.m_data);
m_data = new char[len];
assert(m_data != NULL);
memcpy(m_data, other.m_data, len);
// 法2:strcpy(m_data, other.m_data);
return *this;
}
int main(char argc, char *argv)
{
String s1;
String s2("222");
s1 = s2;
return 0;
}
#补充:
析构中,delete后,置指针为NULL防止野指针