2024年9月3日 C++ 重载练习

#include <iostream>
#include <cstring>

using namespace std;

class Mystring
{
public:
    // 无参构造函数
    Mystring() : str(nullptr), len(0)
    {
        cout << "无参构造函数" << endl;
    }

    // 有参构造函数
    Mystring(const char* s)
    {
        if (s) {
            len = strlen(s);
            str = new char[len + 1];
            strcpy(str, s);
        } else {
            str = nullptr;
            len = 0;
        }
        cout << "有参构造函数" << endl;
    }

    // 拷贝构造函数
    Mystring(const Mystring &other) : len(other.len)
    {
        str = new char[len + 1];
        strcpy(str, other.str);
        cout << "深拷贝构造函数" << endl;
    }

    // 拷贝赋值函数
    Mystring& operator=(const Mystring &other)
    {
        if (this != &other)
        {
            delete[] str; // 释放旧内存
            len = other.len;
            str = new char[len + 1];
            strcpy(str, other.str);
        }
        cout << "拷贝赋值函数" << endl;
        return *this;
    }

    // 获取字符串
    void show() const
    {
        cout << "len=" << len << " str=" << (str ? str : "null") << endl;
    }

    // 获取长度
    void getlen() const
    {
        cout << "len=" << len << endl;
    }

    // 检查是否为空
    void isnull() const
    {
        cout << (str == nullptr ? "True" : "False") << endl;
    }

    // 通过下标访问字符
    void getc(int i) const
    {
        if (i >= len || i < 0)
        {
            cout << "越界了" << endl;
        }
        else if (str != nullptr)
        {
            cout << str[i] << endl;
        }
    }

    // 析构函数
    ~Mystring()
    {
        delete[] str;
        cout << "析构函数" << endl;
    }

    // 拼接操作符
    Mystring operator+(const Mystring &R) const
    {
        Mystring result;
        result.len = len + R.len;
        result.str = new char[result.len + 1]; // +1 用于存储结尾的 '\0'

        strcpy(result.str, str ? str : "");
        strcat(result.str, R.str ? R.str : "");

		return result;
	}

	// !=操作
	bool operator!=(const Mystring &R) const
	{
		return len != R.len || strcmp(str, R.str) != 0;
	}

	// ==操作
	bool operator==(const Mystring &R) const
	{
		return len == R.len && strcmp(str, R.str) == 0;
	}


	// >操作
	bool operator>(const Mystring &R) const         
	{
		return strcmp(str,R.str)>0 || len>R.len;
	}

	//<操作
	bool operator<(const Mystring &R) const
	{
		return strcmp(str,R.str)<0 || len<R.len;
	}


	//>=操作
	bool operator>=(const Mystring &R) const
	{
		return strcmp(str,R.str)>=0;
	}                                                

	//<操作
	bool operator<=(const Mystring &R) const
	{
		return strcmp(str,R.str)<=0;
	}

	friend	istream& operator>>(istream &L,Mystring &R);
	friend ostream& operator<<(ostream &L, Mystring &R);
private:
	char *str;
	int len;
};


// cin重载
istream& operator>>(istream &L, Mystring &R)
{
    char buffer[1000];
    L >> buffer;

    // 释放之前分配的内存
    delete[] R.str;

    // 分配新的内存并复制输入内容
    R.len = strlen(buffer);
    R.str = new char[R.len + 1];
    strcpy(R.str, buffer);

    return L;
}

// cout重载
ostream& operator<<(ostream &L, Mystring &R)
{
	L<<"R.len="<<R.len<<" R.str="<<R.str<<endl;
	return L;
}

int main()
{
	Mystring string1("hello");  // 构造函数
	Mystring string4("world");

    // 拼接操作符
    Mystring string5 = string1 + string4;
    string5.show();

	// !=操作
	if (string1 != string4)
	{
		cout << "string1 和 string4 不相等" << endl;
	}

	// ==操作
	if (string1 == string4)
	{
		cout << "string1 和 string4 相等" << endl;
	}
	else
		cout << "string1 和 string4 不相等" << endl;

	//>操作
	if (string1 > string4)
	{
		cout << "string1 > string4"  << endl;
	}                                                  

	//<操作
	if (string1 < string4)
	{
		cout << "string1 < string4"  << endl;
	}


	//>=操作
	if (string1 >= string4)
	{
		cout << "string1 >= string4"  << endl;
	}

	//<=操作
	if (string1 <= string4)
	{
		cout << "string1 <= string4"  << endl;
	}
	//>>操作
	Mystring string6;
    cin >> string6;
    string6.show();
	
	//<<操作
	cout<<string6<<endl;
	return 0;


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值