设计一个 String???类(本文档中???代表均学号后 3 位),并实现以下①~ ⑥共六个功能。 int main() { String??? s1 = "Hello, c++!"; // ①创建并初始化对象 cout << s1 << endl; // ②输出对象 try { // 捕获异常 s1[7] = 'C'; // ③通过[]修改字符 cout << s1 << endl; s1[30] = 'A'; cout << s1 << endl; } catch (out_of_range& e) { // ④ 异常处理 cout << "Exception : " << e.what() << endl; } s1 = "Hello, China!"; // ⑤ 赋值运算 cout << s1 << endl; } // ⑥ 程序结束后,要能够正常销毁对象
时间: 2023-10-30 07:13:33 浏览: 103
好的,根据你的要求,我会给出一个C++代码来实现这个String类,并实现以下六个功能:
```cpp
#include <iostream>
#include <cstring>
#include <stdexcept>
using namespace std;
class String {
public:
String() : str(nullptr), len(0) {} // 默认构造函数
String(const char* s) : str(nullptr), len(0) { // 构造函数
if (s) {
len = strlen(s);
str = new char[len+1];
strcpy(str, s);
}
}
~String() { delete[] str; } // 析构函数
String& operator=(const char* s) { // 赋值运算符重载
if (str) delete[] str;
if (s) {
len = strlen(s);
str = new char[len+1];
strcpy(str, s);
}
else {
str = nullptr;
len = 0;
}
return *this;
}
char& operator[](int index) { // 下标运算符重载
if (index < 0 || index >= len)
throw out_of_range("Index out of range");
return str[index];
}
friend ostream& operator<<(ostream& os, const String& s) { // 输出运算符重载
os << s.str;
return os;
}
private:
char* str; // 字符串指针
int len; // 字符串长度
};
```
在这个设计中,我们定义了一个String类,其中包含了默认构造函数、构造函数、析构函数、赋值运算符重载、下标运算符重载和输出运算符重载。
默认构造函数用于创建一个空的String对象。构造函数用于创建并初始化String对象,将传入的字符串复制到对象中。析构函数用于释放对象占用的内存。
赋值运算符重载用于将一个字符串赋值给String对象,先释放对象原有的内存,然后根据传入的字符串分配新的内存。下标运算符重载用于访问String对象中的某个字符,如果下标越界则抛出out_of_range异常。输出运算符重载用于将String对象输出到标准输出流中。
在main函数中,我们创建一个String对象s1,并将其初始化为"Hello, c++!"。然后输出对象s1,修改s1中的第7个字符为'C',再次输出s1,以及试图修改s1中的第30个字符为'A',并在出现异常时进行处理。接着将s1赋值为"Hello, China!",并输出对象s1。最后程序结束时会自动调用析构函数,销毁对象s1。
阅读全文