简易实现各种运算符重载

#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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值