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,实现了字符串复制、赋值、连接、比较、下标访问等功能,并利用运算符重载和多态性实现字符串操作。通过多态性,我们可以用统一的接口操作不同类型的形状,提高代码的灵活性和可维护性。

C++ 字符串类 String 实现:重载运算符、多态性应用

原文地址: https://www.cveoy.top/t/topic/oy4E 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录