编写String类

编写类String的构造函数、析构函数和赋值函数。

注意事项:

  • new出来的内存空间没有被初始化
  • delete之后,内存无法访问,但指针的值不为空。为了避免野指针的出现,delete之后需要将指针赋值为nullptr

class String
{
private:
 char *m_data;
public:
 // 普通构造函数
 String(const char *str)
 {
 if (str == nullptr) // 加分点:对m
 {
 delete []m_data; // 即使m_data为nullptr,使用delete也没有任何问题
 m_data = new char[1]; // 得分点:对空字符串自动申请存放结束标志'\0'
 if (m_data == nullptr) // 加分点:对分配内存失败做检测
 {
 std::cout << "Memory allocated error!" << std::endl;
 exit(1);
 }
 *m_data = '\0';
 }
 else
 {
 int length = strlen(str);
 m_data = new char[length + 1]; // 加1一定不能忘掉
 // 加1一定不能忘掉
 // 加1一定不能忘掉
 if (m_data == nullptr) // 加分点:对分配内存失败做检测
 {
 std::cout << "Memory allocated error!" << std::endl;
 exit(1);
 }
 strcpy(m_data, str);
 }
 }
 // 拷贝构造函数
 String(const String& str)
 {
 int length = strlen(str.m_data);
 m_data = new char[length + 1]; // 加1一定不能忘掉
 // 加1一定不能忘掉
 // 加1一定不能忘掉
 if (m_data == nullptr) // 加分点:对分配内存失败做检测
 {
 std::cout << "Memory allocated error!" << std::endl;
 exit(1);
 }
 strcpy(m_data, str.m_data);
 }
 // 赋值运算符重载
 String& operator=(const String& str) // 得分点,输入参数为const型
 {
 if (this == &str) // 得分点:检查自赋值
 return *this; // 得分点,返回自身的引用,实现链式赋值
 delete[] m_data; // 得分点,释放原有内存
 int length = strlen(str.m_data);
 m_data = new char[length + 1]; // 加1一定不能忘掉
 // 加1一定不能忘掉
 // 加1一定不能忘掉
 if (m_data == nullptr) // 加分点:对分配内存失败做检测
 {
 std::cout << "Memory allocated error!" << std::endl;
 exit(1);
 }
 strcpy(m_data, str.m_data);
 return *this; // 得分点,返回自身的引用,实现链式赋值
 }
 // 析构函数
 ~String()
 {
 delete[]m_data;
 m_data = nullptr; // 得分点,将new出来的内存空间delete掉之后,将指针
 // 设为nullptr,避免称为野指针
 }
};

版本一:完成了String类的基本功能。2018/3/11

版本二:增加了对内存分配失败的判断。 2018/3/12

发表评论

电子邮件地址不会被公开。 必填项已用*标注

2 × 4 =

14 − = 13