2.重载+ 增加数据,增加数据要实现的形态: “123456789” + “abc” 得到 “123456789abc” (最多new一次)
时间: 2023-10-11 17:08:24 浏览: 203
好的,针对您的问题,我可以提供以下的实现方式:
```cpp
#include <cstring>
#include <iostream>
class String {
public:
String() : data_(nullptr), size_(0), capacity_(0) {}
String(const char* str) : data_(nullptr), size_(0), capacity_(0) {
append(str);
}
~String() {
if (data_ != nullptr) {
delete[] data_;
}
}
String(const String& other) : data_(nullptr), size_(0), capacity_(0) {
append(other.data_);
}
String& operator=(const String& other) {
if (&other != this) {
clear();
append(other.data_);
}
return *this;
}
void append(const char* str) {
size_t len = std::strlen(str);
reserve(size_ + len);
std::memcpy(data_ + size_, str, len);
size_ += len;
}
void reserve(size_t new_capacity) {
if (new_capacity > capacity_) {
char* new_data = new char[new_capacity];
if (data_ != nullptr) {
std::memcpy(new_data, data_, size_);
delete[] data_;
}
data_ = new_data;
capacity_ = new_capacity;
}
}
void clear() {
if (data_ != nullptr) {
delete[] data_;
data_ = nullptr;
size_ = 0;
capacity_ = 0;
}
}
friend String operator+(const String& lhs, const char* rhs) {
String result(lhs);
result.append(rhs);
return result;
}
friend std::ostream& operator<<(std::ostream& os, const String& str) {
os.write(str.data_, str.size_);
return os;
}
private:
char* data_;
size_t size_;
size_t capacity_;
};
int main() {
String s1("123456789");
String s2 = s1 + "abc";
std::cout << s2 << std::endl; // 输出 "123456789abc"
return 0;
}
```
在这个实现中,我们定义了一个 `String` 类,表示一个动态分配内存的字符串。我们通过 `append` 方法将一个字符串附加到当前字符串的末尾,通过 `reserve` 方法预留足够的内存空间,避免频繁分配内存。同时,我们通过重载 `operator+` 实现了字符串的拼接操作,使用时可以直接将一个 `String` 对象和一个 `const char*` 字符串相加,得到一个新的 `String` 对象。最后,我们通过重载 `operator<<` 实现了输出操作,可以直接将一个 `String` 对象输出到标准输出流中。
阅读全文