Lab7: 面向对象程序构造方法及创新应用 (基础)

发布时间 2023-12-12 16:58:44作者: conprour

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;
    }
    */

输出

image