#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;
}
2024年9月3日 C++ 重载练习
最新推荐文章于 2024-11-17 15:19:52 发布