做题笔记 -- C++string类

一点笔试记录,记录复盘用
今天笔试的内容是写一个string类,写的时候有点懵,现在重新梳理一下。
还是要打好基础啊啊啊!

要求

题目:写出String类的成员函数

//已知String类定义如下,请实现类成员函数:
class String
{
public:
  String(const char *str = NULL); // 通用构造函数
  String(const String &another); // 拷贝构造函数
  ~String(); // 析构函数
  String& operater =(const String &rhs); // 赋值函数
private:
  char* m_data; // 用于保存字符串
};

具体实现

通用构造函数/默认构造函数

// 通用构造函数 
// 什么都不传入 or 传入参数
String::String(const char* str) {
  if(str == NULL) {
  // 判断传入是否为空指针
  // str为空 -- 创建空字符串
    m_data = new char[1];
    *m_data = '\0';
    // *m_data -- 0x10(地址)
  } else {
  // 非空字符串
  // 统计字符个数
    int length = strlen(str);
    m_data = new char[length + 1];
    // length + 1:包括\0
    strcpy(m_data, str);
    // 将str中的字符放到m_data开始的地址
  }
}

拷贝构造函数

// 拷贝构造函数
String::String(const String &other) {
// strlen函数是char*类型的,所以是strlen(other.m_data) 而不是直接写strlen(other)  
  int length = strlen(other.m_data);
  m_data = new char[length + 1];
  strcpy(m_data, other.m_data);
}

赋值函数(拷贝赋值)

// 赋值函数
String& String::operater = (const String &other) {
  // 自身给自身拷贝赋值的情况
  if(this == &other) {
    return *this;
    // *this:other的地址
  }
  // 将原来的“房子”拆掉
  delete [] m_data;
  // 重新修新“房子”
  // 参考
  int length = strlen(other.m_data);
  m_data = new char[length + 1];
  strcpy(m_data, other.m_data);
  return *this;
}

析构函数

// 析构函数
String::~String() {
  delete [] m_data;
}

改进

移动构造

这里参考视频:写一个string类|C++学习笔记|拷贝构造|拷贝赋值|移动构造|移动赋值
在这里插入图片描述

String::String(String &&str) {
	m_data = str.m_data;
	// 
	std.m_data = nullptr;
	// A为nullptr
}

移动赋值

在这里插入图片描述
B已有内容,要将B指向A指向的内容

String &String::operator=(String&& str) {
	// 拆掉B原来的“房子”,避免内存泄漏
	delete[] m_data;
	// 把A的房子给B
	m_data = str.m_data;
	// 将A置空
	str.m_data = nullptr;
	// B对象本身存在,直接return该对象
	return *this;
}
  • 9
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值