1、实现一个自定义字符串类型 String,使之具有与 int 等基本类型相同的使用方式。(注:含类、构造、析构、重载等机制运用)
需要分清默认构造函数、拷贝构造函数、带参数构造函数和重载的赋值运算符。
其中加法重载稍微复杂一点。
代码
#include <iostream>
#include <cstring>
class String {
private:
char* data; // 字符串数据
size_t length; // 字符串长度
public:
// 默认构造函数
String() : data(NULL), length(0) {puts("默认构造");}
// 构造函数
String(const char* str) {
puts("带参数构造");
length = strlen(str); // 获取字符串长度
data = new char[length + 1]; // 分配内存
strcpy(data, str); // 复制字符串
}
// 拷贝构造函数
String(const String& other) {
length = other.length; // 获取字符串长度
data = new char[length + 1]; // 分配内存
strcpy(data, other.data); // 复制字符串
}
// 析构函数
~String() {
puts("析构");
delete[] data; // 释放内存
}
// 重载相加运算符
String operator+(const String& other) const {
String result;
result.length = length + other.length; // 计算结果长度
result.data = new char[result.length + 1]; // 分配内存
strcpy(result.data, data); // 复制当前字符串
strcat(result.data, other.data); // 连接另一个字符串
return result;
}
// 重载相等运算符
bool operator==(const String& other) const {
return strcmp(data, other.data) == 0;
}
// 重载输出运算符
friend std::ostream& operator<<(std::ostream& os, const String& str) {
os << str.data;
return os;
}
};
int main() {
String str1 = "Hello";
String str2 = "World";
String str3 = str1 + str2;
String str4;
//str4 = str1 + str2; 这一行要用到重载赋值运算符
std::cout << str1 << std::endl;
std::cout << str2 << std::endl;
std::cout << str3 << std::endl;
if (str1 == str2) {
std::cout << "str1 and str2 are equal" << std::endl;
} else {
std::cout << "str1 and str2 are not equal" << std::endl;
}
return 0;
}
/*
// 重载赋值运算符
String& operator=(const String& other) {
if (this != &other) {
delete[] data; // 释放原有内存
length = other.length; // 获取字符串长度
data = new char[length + 1]; // 分配新内存
strcpy(data, other.data); // 复制字符串
}
return *this;
}
*/