#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<string>
using namespace std;
class mystring
{
public:
friend ostream& operator <<(ostream& cout,mystring & p); //初始化<<运算符
friend istream& operator >>(istream& cin, mystring & p); //初始化>>运算符
mystring();//默认初始化
mystring(char *a);//有参初始化
mystring(const mystring &p);//拷贝构造
mystring& operator=(char *a);//=重载,这个是针对字符数组的重载
mystring& operator= (mystring &p);//=重载,这个是针对对象的重载
char& operator[](int a);//重载[]
mystring operator+(mystring &p); //+运算符重载
mystring operator+(char *a);
~mystring();//析构函数
private:
char *mystr; //定义字符串变量
int mysize; //定义字符串长度
};
mystring::mystring(char *a) //有参构造函数的实现
{
this->mystr = new char[strlen(a) + 1];
strcpy(this->mystr, a);
this->mysize = strlen(a);
}
mystring::mystring(const mystring &p)//拷贝构造函数
{
this->mystr = new char[strlen(p.mystr) + 1];
strcpy(this->mystr, p.mystr);
this->mysize = p.mysize;
}
mystring::~mystring() //析构函数
{
if (this->mystr != NULL)
{
delete[] this->mystr;
this->mystr = NULL;
}
}
ostream& operator <<(ostream& cout,mystring & pp)//左移重载不需要在函数内部声明,拿全局函数即可,但记得要友元化
{
cout << pp.mystr << endl;
return cout;
}
istream& operator >>(istream& cin,mystring & p)
{
if (p.mysize != NULL) //首先删除原有空间内容
{
delete[] p.mystr;
p.mystr = NULL;
}
char buf[1024]; //定义一个缓冲区作为中间存储区
cin >> buf; //输入内容
p.mystr = new char[strlen(buf) + 1]; //重新申请新的空间
strcpy(p.mystr, buf);
p.mysize = strlen(buf);
return cin;
}
mystring& mystring::operator=(char *a)
{
if (this->mystr != NULL)
{
delete[] this->mystr;
this->mystr = NULL;
}
this->mystr = new char[strlen(a) + 1];
strcpy(this->mystr, a);
this->mysize = strlen(a);
return *this;
}
mystring& mystring::operator=(mystring &p)
{
if (this->mystr != NULL)
{
delete[] this->mystr;
this->mystr = NULL;
}
this->mystr = new char[strlen(p.mystr) + 1];
strcpy(this->mystr, p.mystr);
this->mysize = p.mysize;
return *this;
}
char& mystring::operator[](int a)
{
return this->mystr[a];
}
mystring mystring::operator+(mystring &p)
{
int newsize = this->mysize + p.mysize + 1;
char *pp = new char[newsize];
memset(pp, 0, newsize);
strcat(pp, this->mystr);
strcat(pp, p.mystr);
mystring newstr(pp);
delete[] pp;
return newstr;
}
mystring mystring::operator+(char *a)
{
int newsize = this->mysize + strlen(a) + 1;
char *pp = new char[newsize];
memset(pp, 0, newsize);
strcat(pp, this->mystr);
strcat(pp, a);
mystring newstr(pp);
delete[] pp;
return newstr;
}
void test() //测试函数1
{
mystring p1("大鸡巴");
mystring p2 = "lajio";
cout << p2;
cout << p1;
cout << "请输入新内容" << endl;
cin >> p1;
cout << p1;
}
void test2() //测试函数2
{
mystring p1("狗腿子");
mystring p2="csdlkcs3123"; //在这里mystring p2="csdlkcs3123";就等于mystring p2(csdlkcs3123),所以调用的是有参构造函数
p2 = p1; //用对象进行赋值,对=进行重载,如果不重载就只是进行简单的值拷贝,类中存在在堆上的值则需要我们进行重载
p2 = "1321654chuaih"; //在这里p2="1321654chuaih"不等同于上面的拷贝构造所以在这里要想实现这个就要对=号进行拷贝构造
cout << p2;
p2[0] = 'w'; //对某个字符进行替换
cout << p2[0] << endl; //再实现一个根据索引求元素的操作
}
void test3()
{
mystring p11("雷柏");
mystring p22("无线键盘鼠标");
mystring p33=" "; //这里要先空赋值,因为我们没有个无参默认函数的实现
p33 = p22 + p11;//重载加号运算符
cout << p33;
}
int main()
{
//test();
//test2();
test3();
return 0;
}
简易实现各种运算符重载
最新推荐文章于 2022-04-18 19:57:36 发布