一点笔试记录,记录复盘用
今天笔试的内容是写一个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;
}