利用数据结构 C++语言实现自定义字符串mystring,实现动态存储分配数据成员: char*st; int size; 函数成员:构造函数 析构函数 复制构造函数 重载运算符[] 友元函数:重载<<,实现字符串输出 重载>>,实现字符串输入 并在主函数中测试 必要位置加注释
时间: 2024-10-17 13:07:26 浏览: 36
C++类的封装之 字符串MyString类
在C++中,我们可以创建一个名为`MyString`的自定义字符串类,利用`std::string`作为内部数据成员以支持动态存储,并添加一些特定功能。以下是这个类的基本实现:
```cpp
#include <iostream>
#include <string>
class MyString {
private:
// 使用std::string作为内部数据成员,用于动态存储字符
std::string st;
// 数据成员size用于记录当前字符串的实际长度
int size;
public:
// 构造函数,初始化字符串为空
MyString() : size(0) {}
// 构造函数,接受初始值
MyString(const char* str) : size(strlen(str)) {
st.resize(size);
strcpy(st.c_str(), str); // 注意这里需要处理空指针和内存分配错误
}
// 析构函数,清理动态内存
~MyString() {
st.clear();
}
// 复制构造函数,复制源字符串内容
MyString(const MyString& src) : size(src.size()) {
st.resize(size);
memcpy(st.c_str(), src.st.c_str(), size * sizeof(char));
}
// 运算符[],访问指定索引的元素
char operator[](const int index) const {
if (index >= 0 && index < size) {
return st[index];
}
throw std::out_of_range("Index out of range");
}
// 自动推导版本的赋值运算符=
MyString& operator=(const MyString& src) {
if (this != &src) {
this->~MyString(); // 先析构旧的对象
new(this) MyString(src); // 再通过placement new创建新的对象
}
return *this;
}
// 重载<<操作符,实现字符串输出
friend std::ostream& operator<<(std::ostream& os, const MyString& str) {
for (char c : str.st) {
os << c;
}
return os;
}
// 重载>>操作符,实现字符串输入
friend std::istream& operator>>(std::istream& is, MyString& str) {
char input[256]; // 假设读取的最大长度为256
is >> input; // 从输入流读入字符
str = input; // 将读取到的内容复制给MyString对象
return is;
}
// 测试部分
void print() const {
std::cout << "MyString: " << *this << "\n";
}
};
// 主函数测试
int main() {
MyString s1("Hello, World!"); // 创建并初始化
s1.print();
MyString s2; // 空字符串实例
std::cin >> s2; // 从用户输入获取字符串
s2.print();
s1 = s2; // 赋值操作
s1.print();
return 0;
}
```
在这个示例中,我们实现了基本的字符串操作,并在主函数中展示了如何创建、初始化、输入和输出自定义字符串。注意在实际项目中,应该处理可能出现的边界条件和异常情况。
阅读全文