今天我笔试的时候遇到这道题,当时是写出来了,但是回到家查了一下答案后,发现基本是写对了,但是有些细节写的有点问题,特地在这里记录下,以提醒自己,大家也自己注意下。
String类结构
class String
{
public:
String(const char *str = NULL); // 普通构造函数
String(const String &other); // 拷贝构造函数
~ String(void); // 析构函数
String & operator =(const String &other); // 赋值函数
private:
char *m_data; // 用于保存字符串
};
String构造函数
String::String(const char *str)
{
if(str==NULL)
{
m_data = new char[1];
if (m_data == NULL)
{
cout << "bad alloc!" << endl;
std::abort();
}
*m_data = '\0';
}
else
{
int length = strlen(str);
m_data = new char[length+1];
if (m_data == NULL)
{
cout << "bad alloc!" << endl;
std::abort();
}
strcpy(m_data, str);
}
}
笔试的时候我是判断了NULL的情况,但是却没默认生成一个空字符串的string,注意在申请的内存的时候最好加个NULL判断,即是否申请成功。
String析构函数
String::~String(void)
{
delete m_data;
}
笔试的时候我还加了非空判断,算是一种保险的策略吧。
String拷贝构造函数
String::String(String &other)
{
int length = strlen(other.m_data);
m_data = new char[length+1];
if (m_data == NULL)
{
cout << "bad alloc!" << endl;
std::abort();
}
strcpy(m_data, other.m_data);
}
笔试的时候没考这个,但是这里记得加const
String赋值函数
String & String::operator =(const String &other)
{
if(this == &other)
return *this;
int length = strlen( other.m_data );
char* temp = new char[length+1];
if (temp == NULL)
{
cout << "bad alloc!" << endl;
std::abort();
}
delete m_data;
m_data = temp;
strcpy( m_data, other.m_data );
return *this;
}
笔试的时候我基本都写对了,就是最后return的时候我写成this,应该是*this,一定要记得!这里有几个关键点,一定要判断是不是自我赋值,为了安全,先判断下内存是否申请成功,在删除原来指向的内容,这里和网上的代码不一样,请注意!这里有个我在笔试纠结的地方,这里就不展开,请看我的另一篇文章《C++访问限定符》