模拟实现string类:字符串操作的底层逻辑分析
实现一个简单的字符串类MyString
可以帮助我们了解C++中字符串操作的底层逻辑。在设计这样一个类时,需要考虑内存管理、字符串的深拷贝和各种常用操作,如连接、比较、查找等。以下是一个基本的实现思路:
MyString类设计
成员变量:
char* data;
:动态分配的字符数组,用于存储字符串内容。size_t length;
:字符串长度(不包括末尾的空字符)。
构造函数:
- 默认构造:初始化为空字符串。
- 带参数构造:从C风格字符串初始化,需分配内存并复制内容。
- 拷贝构造:实现深拷贝。
- 移动构造(如果支持):实现资源的转移,避免不必要的深拷贝。
析构函数:
- 释放动态分配的内存。
成员函数:
size_t size() const
:返回字符串长度。const char* c_str() const
:返回C风格字符串(以便与C库兼容)。MyString& operator=(const MyString&)
:拷贝赋值运算符,注意处理自赋值。MyString& operator=(MyString&&)
:移动赋值运算符。MyString operator+(const MyString&) const
:字符串连接。bool operator==(const MyString&) const
:字符串比较。MyString substring(size_t start, size_t len) const
:子字符串提取。
私有辅助函数:
void copyFrom(const MyString&)
:辅助拷贝函数。void free()
:释放已分配的内存。
实现细节
#include <cstring>
#include <iostream>
class MyString {
private:
char* data;
size_t length;
void copyFrom(const MyString& other) {
data = new char[other.length + 1];
std::strcpy(data, other.data);
length = other.length;
}
void free() {
delete[] data;
}
public:
MyString() : data(new char[1]), length(0) {
data[0] = '\0';
}
MyString(const char* str) {
length = std::strlen(str);
data = new char[length + 1];
std::strcpy(data, str);
}
MyString(const MyString& other) {
copyFrom(other);
}
MyString(MyString&& other) noexcept : data(other.data), length(other.length) {
other.data = nullptr;
other.length = 0;
}
~MyString() {
free();
}
MyString& operator=(const MyString& other) {
if (this != &other) {
free();
copyFrom(other);
}
return *this;
}
MyString& operator=(MyString&& other) noexcept {
if (this != &other) {
free();
data = other.data;
length = other.length;
other.data = nullptr;
other.length = 0;
}
return *this;
}
size_t size() const {
return length;
}
const char* c_str() const {
return data;
}
MyString operator+(const MyString& other) const {
MyString result;
result.length = length + other.length;
result.data = new char[result.length + 1];
std::strcpy(result.data, data);
std::strcat(result.data, other.data);
return result;
}
bool operator==(const MyString& other) const {
return std::strcmp(data, other.data) == 0;
}
MyString substring(size_t start, size_t len) const {
if (start >= length || start + len > length) {
// Addressing out of range access with a simple check
return MyString();
}
char* sub_data = new char[len + 1];
std::strncpy(sub_data, data + start, len);
sub_data[len] = '\0';
MyString substring(sub_data);
delete[] sub_data;
return substring;
}
};
核心要点
- 内存管理:利用动态内存分配和手动释放来模拟字符串存储。
- 深拷贝:确保拷贝构造和赋值运算符进行深拷贝,以防止悬挂指针问题。
- 高效资源管理:使用移动语义避免不必要的拷贝(如切换所有权)。
通过这样一个模拟实现,可以更好地理解C++标准库std::string
的内部运作方式,以及为何内存管理和深拷贝是实现自定义类的重要组成部分。