根据给出的头文件实现String类
class String
{
public:
String(const char* str = NULL); //构造
String(const String& Str); //拷贝构造函数
String& operator = (const String& S); //运算符重载
~String();
char* m_data;
};
此题考查应聘者对构造函数,析构函数,复制拷贝函数以及赋值函数的掌握情况。同时也考察了对指针,字符串以'\0'结尾,深拷贝和浅拷贝的掌握情况。看似简单,要想拿满分也不容易。
以下是实现代码
String::String(const char* str)
{
//判断初始化构造函数的字符串是否为空
if (str == nullptr)
{
m_data = new char[1];
m_data[0] = '\0';
}
else
{
m_data = new char[strlen(str) + 1];//注意这里要加1,最后一个字符是以'\0'结尾.
strcpy_s(m_data,strlen(str), str); //在windows下采用strcpy_s
}
}
String::~String()
{
delete[]m_data; //用delete[]释放内存,而不是用delete。
m_data = nullptr; //释放内存时需要将原指针指向空,避免成为野指针
}
String::String(const String& Str)
{
//拷贝构造函数,无需判断
m_data = new char[strlen(Str.m_data) + 1];//注意这里要加1,最后一个字符是以'\0'结尾.
strcpy_s(m_data,strlen(Str.m_data), Str.m_data);
}
String& String::operator = (const String& S)
{
//运算符重载,先判断两串是否是同一个字符串
if (S.m_data == m_data)
{
return *this;
}
else
{
delete[]m_data;
m_data = new char[strlen(S.m_data) + 1]; //注意这里要加1,最后一个字符是以'\0'结尾.
strcpy_s(m_data,strlen(S.m_data), S.m_data);
}
return *this;
}