C++ 字符串类 String 实现:重载运算符、多态性应用
C++ 自定义字符串类 String 实现:重载运算符、多态性应用
本文将介绍如何使用 C++ 语言设计一个自定义字符串类 String,并通过重载运算符和多态性实现字符串的操作,包括复制、赋值、连接、比较、下标访问等功能。
1. 字符串类 String 的设计
#include <iostream>
#include <cstring>
class String {
public:
// 构造函数
String();
String(const char* str);
String(const String& str);
// 析构函数
~String();
// 复制函数
String& operator=(const String& str);
String& operator=(const char* str);
// 连接函数
String operator+(const String& str) const;
String& operator+=(const String& str);
// 下标访问函数
char& operator[](int index);
const char& operator[](int index) const;
// 比较函数
bool operator==(const String& str) const;
bool operator<(const String& str) const;
// 输入输出函数
friend std::ostream& operator<<(std::ostream& out, const String& str);
friend std::istream& operator>>(std::istream& in, String& str);
// 获取字符串长度
int length() const;
private:
char* data; // 字符指针
};
// 构造函数
String::String() : data(nullptr) {
data = new char[1];
*data = '\0';
}
String::String(const char* str) : data(nullptr) {
if (str != nullptr) {
data = new char[strlen(str) + 1];
strcpy(data, str);
} else {
data = new char[1];
*data = '\0';
}
}
String::String(const String& str) : data(nullptr) {
if (str.data != nullptr) {
data = new char[strlen(str.data) + 1];
strcpy(data, str.data);
} else {
data = new char[1];
*data = '\0';
}
}
// 析构函数
String::~String() {
delete[] data;
}
// 复制函数
String& String::operator=(const String& str) {
if (this != &str) {
delete[] data;
if (str.data != nullptr) {
data = new char[strlen(str.data) + 1];
strcpy(data, str.data);
} else {
data = new char[1];
*data = '\0';
}
}
return *this;
}
String& String::operator=(const char* str) {
if (str != nullptr) {
delete[] data;
data = new char[strlen(str) + 1];
strcpy(data, str);
} else {
delete[] data;
data = new char[1];
*data = '\0';
}
return *this;
}
// 连接函数
String String::operator+(const String& str) const {
String result;
result.data = new char[length() + str.length() + 1];
strcpy(result.data, data);
strcat(result.data, str.data);
return result;
}
String& String::operator+=(const String& str) {
char* temp = new char[length() + str.length() + 1];
strcpy(temp, data);
strcat(temp, str.data);
delete[] data;
data = temp;
return *this;
}
// 下标访问函数
char& String::operator[](int index) {
return data[index];
}
const char& String::operator[](int index) const {
return data[index];
}
// 比较函数
bool String::operator==(const String& str) const {
return strcmp(data, str.data) == 0;
}
bool String::operator<(const String& str) const {
return strcmp(data, str.data) < 0;
}
// 输入输出函数
std::ostream& operator<<(std::ostream& out, const String& str) {
out << str.data;
return out;
}
std::istream& operator>>(std::istream& in, String& str) {
char temp[1024];
in >> temp;
str = temp;
return in;
}
// 获取字符串长度
int String::length() const {
return strlen(data);
}
int main() {
String str1("Hello");
String str2(" World!");
String str3 = str1 + str2;
std::cout << "str1: " << str1 << std::endl;
std::cout << "str2: " << str2 << std::endl;
std::cout << "str3: " << str3 << std::endl;
String str4;
std::cout << "请输入字符串: ";
std::cin >> str4;
std::cout << "您输入的字符串是: " << str4 << std::endl;
return 0;
}
2. 多态性的应用
#include <iostream>
class Shape {
public:
virtual double getArea() const = 0; // 纯虚函数,计算面积
virtual void print() const = 0; // 虚函数,打印信息
};
class Triangle : public Shape {
public:
Triangle(double base, double height) : base(base), height(height) {}
double getArea() const override { return 0.5 * base * height; }
void print() const override {
std::cout << "Triangle: base = " << base << ", height = " << height << std::endl;
}
private:
double base, height;
};
class Circle : public Shape {
public:
Circle(double radius) : radius(radius) {}
double getArea() const override { return 3.14159 * radius * radius; }
void print() const override {
std::cout << "Circle: radius = " << radius << std::endl;
}
private:
double radius;
};
class Rectangle : public Shape {
public:
Rectangle(double width, double height) : width(width), height(height) {}
double getArea() const override { return width * height; }
void print() const override {
std::cout << "Rectangle: width = " << width << ", height = " << height << std::endl;
}
private:
double width, height;
};
int main() {
Shape* shapes[3];
shapes[0] = new Triangle(3, 4);
shapes[1] = new Circle(5);
shapes[2] = new Rectangle(6, 8);
for (int i = 0; i < 3; i++) {
std::cout << "Shape " << i + 1 << ":" << std::endl;
std::cout << "Area: " << shapes[i]->getArea() << std::endl;
shapes[i]->print();
std::cout << std::endl;
}
// 释放内存
delete shapes[0];
delete shapes[1];
delete shapes[2];
return 0;
}
3. 总结
本文介绍了如何使用 C++ 语言设计一个自定义字符串类 String,实现了字符串复制、赋值、连接、比较、下标访问等功能,并利用运算符重载和多态性实现字符串操作。通过多态性,我们可以用统一的接口操作不同类型的形状,提高代码的灵活性和可维护性。
原文地址: https://www.cveoy.top/t/topic/oy4E 著作权归作者所有。请勿转载和采集!