C++ string 类的模拟实现探讨
模拟实现一个C++的string
类是一个很好的练习,用来深入理解内存管理、动态分配以及面向对象的设计原则。以下是一个简化版本的MyString
类实现:
#include <iostream>
#include <cstring>
class MyString {
private:
char* data;
size_t length;
public:
// Default constructor
MyString() : data(nullptr), length(0) {}
// Parameterized constructor
MyString(const char* str) {
if (str) {
length = strlen(str);
data = new char[length + 1];
strcpy(data, str);
} else {
data = nullptr;
length = 0;
}
}
// Copy constructor
MyString(const MyString& other) {
length = other.length;
data = new char[length + 1];
strcpy(data, other.data);
}
// Move constructor
MyString(MyString&& other) noexcept : data(other.data), length(other.length) {
other.data = nullptr;
other.length = 0;
}
// Destructor
~MyString() {
delete[] data;
}
// Copy assignment operator
MyString& operator=(const MyString& other) {
if (this == &other) return *this;
delete[] data;
length = other.length;
data = new char[length + 1];
strcpy(data, other.data);
return *this;
}
// Move assignment operator
MyString& operator=(MyString&& other) noexcept {
if (this == &other) return *this;
delete[] data;
data = other.data;
length = other.length;
other.data = nullptr;
other.length = 0;
return *this;
}
// Other functionalities can be added such as append, find, etc.
// Function to get string data
const char* c_str() const {
return data;
}
// Function to get length of the string
size_t size() const {
return length;
}
};
int main() {
MyString s1("Hello, World!");
MyString s2 = s1; // Copy constructor
MyString s3;
s3 = std::move(s1); // Move assignment
std::cout << "s2: " << s2.c_str() << std::endl;
std::cout << "s3: " << s3.c_str() << std::endl;
std::cout << "s3 size: " << s3.size() << std::endl;
return 0;
}
关键点解析:
构造函数:
- 默认构造函数初始化为空字符串。
- 有参构造函数从C风格的字符串初始化
MyString
。
复制控制:
- 复制构造函数和复制赋值运算符负责深拷贝。
- 移动构造函数和移动赋值运算符负责高效移动资源(通过指针重定向)。
析构函数:
- 在对象生命周期结束时释放分配的内存。
其他功能:
- 提供了基础功能如获取字符串内容和长度,可以根据需求扩展其他字符串操作(如拼接、查找等)。
该实现没有包含完整的功能和边界检测,是用于概念展示的简单版本。在实际使用中可能需要考虑更多的边界情况和优化。