ITPub博客

首页 > IT职业 > IT图书 > 常用的重载运算符你了解几个?

常用的重载运算符你了解几个?

原创 IT图书 作者:专注的阿熊 时间:2020-03-26 16:17:00 0 删除 编辑

知识点介绍
运算符重载,就是对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型运算符重载的目的:简化操作 让已有的运算符 适应适应不同的数据类型。
简单的介绍一下,接下来酒肉伺候~
由于比较多,故分文件来实现
mystring.h


#ifndef MYSTRING_H
#define MYSTRING_H
#include<iostream>


using namespace std;


class myString
{
//重载<<运算符
    friend ostream &operator <<(ostream &out,myString &ob);
    //重载>>运算符
    friend istream &operator >>(istream &in,myString &ob);
private:
    char *str;
    int size;
public:
    myString();//无参构造函数
    myString(char *str);//有参构造函数
    myString(const myString &ob);//拷贝构造函数
    ~myString();//析构函数
    int size1(void);//返回size大小
    //重载[]运算符
    char &operator [](int index);
    //重载=运算符
    myString &operator =(const myString &ob);
    //实现对象和字符串的直接=运算
    myString &operator =(const char *str);
    //重载+运算符
    myString &operator +(const myString &ob);
     //实现对象和字符串的直接+运算
    myString &operator +(const char *str);
    //重载==运算符
    bool operator ==(const myString &ob);
     //实现对象和字符串的直接==运算
    bool operator ==(const char *str);
};




#endif // MYSTRING_H



mystring.cpp


#include "mystring.h"
#include<iostream>
#include<string.h>




using namespace std;






//无参构造函数
myString::myString()
{
    str=NULL;
    size=0;
    cout<<"无参构造"<<endl;
}


//有参构造函数
myString::myString(char *str)
{
    cout<<"有参构造"<<endl;
    this->str=new char [strlen(str)+1];
    strcpy(this->str,str);




    size=strlen(str);
}


//拷贝构造函数
myString::myString(const myString &ob)
{
//清空str的原有内容,防止内存泄漏
    if(this->str!=NULL)
    {
        delete [] str;
        this->str=NULL;
    }
    this->str=new char [strlen(ob.str)+1];
    strcpy(this->str,ob.str);




    size=ob.size;




}


//析构函数
myString::~myString()
{
    if(str!=NULL)
    {
        delete [] str;
        this->str=NULL;
    }
}


//返回size大小
int myString::size1()
{
    return size;
}


//重载[]运算符
char &myString::operator [](int index)
{
//判断size大小是否合理
    if(index>0 && index<size)
    {
        return str[index];
    }




    else
    {
        cout<<"无效的index"<<endl;
    }
}


/重载=运算符
myString &myString::operator =(const myString &ob)
{
//清空str的原有内容,防止内存泄漏
    if(str!=NULL)
    {
        delete [] str;
        str=NULL;
    }




    str=new char[ob.size+1];
    strcpy(str,ob.str);




    size=ob.size;
    return *this;//返回当前引用对象




}


//实现对象和字符串的直接=运算
myString &myString::operator =(const char *str)
{
    if(this->str!=NULL)
    {
        delete [] this->str;
        this->str=NULL;
    }




    this->str=new char[strlen(str)+1];
    strcpy(this->str,str);




    size=strlen(str);
    return *this;
}


//重载+运算符
myString & myString::operator +(const myString &ob)
{
    char* tmp_str=new char[ob.size+size+1];
    memset(tmp_str,0,ob.size+size+1);
    strcpy(tmp_str,str);
    strcat(tmp_str,ob.str);


//tmp为局部变量,仅在当前大括号有效,加static使其成为静态局部变量 防止其释放
    static myString tmp(tmp_str);
    return tmp;
}


//实现对象和字符串的直接+运算
myString &myString::operator +(const char *str)
{
    char* tmp_str=new char[strlen(str)+size+1];
    memset(tmp_str,0,strlen(str)+size+1);
    strcpy(tmp_str,this->str);
    strcat(tmp_str,str);




    static myString tmp(tmp_str);
    return tmp;
}


//重载==运算符
//返回值bool类型,if判断语句需要
bool myString::operator ==(const myString &ob)
{
    if(strcmp(str,ob.str)==0)
        return true;
    else
        return false;
}

欧元符号 http://www.gendan5.com/currency/EUR.html

//实现对象和字符串的直接+运算
bool myString::operator ==(const char *str)
{
    if(strcmp(this->str,str)==0)
        return true;
    else
        return false;
}


//重载<<运算符
ostream &operator <<(ostream &out, myString &ob)
{
    out<<ob.str;
    return out;
}


//重载>>运算符
istream &operator >>(istream &in,myString &ob)
{
    cout<<"请输入要输入的字符串:";
    if(ob.str!=NULL)
    {
        delete [] ob.str;
        ob.str=NULL;
    }




    char buf[1024];
    in>>buf;
    ob.str=new char[strlen(buf)+1];
    strcpy(ob.str,buf);
    ob.size=strlen(buf);




    return in;
}

main.cpp


#include <iostream>
#include<mystring.h>




using namespace std;




int main(int argc, char *argv[])
{
    myString ob1("lucy");
    cout<<ob1<<endl;
    cout<<"size="<<ob1.size1()<<endl;




    cin>>ob1;
    cout<<ob1<<endl;
    cout<<"size="<<ob1.size1()<<endl;
    ob1[1]='E';
    cout<<ob1<<endl;




    myString ob2=ob1;
    cout<<ob2<<endl;
    cout<<"size="<<ob2.size1()<<endl;




    myString ob3=ob2;
    cout<<ob3<<endl;
    cout<<"size="<<ob3.size1()<<endl;
    myString ob4="hello ob4";
    cout<<ob4<<endl;
    cout<<"size="<<ob4.size1()<<endl;




    myString ob5("我爱美女");
    myString ob6("美女爱我");
    cout<<ob5+ob6<<endl;
    cout<<ob5+"hello ob5"<<endl;




    myString ob7("hehe");
    myString ob8("haha");
    if(ob7==ob8)
    {
        cout<<"相等"<<endl;
    }
    else
    {
        cout<<"不相等"<<endl;
    }




    if(ob7=="hehe")
    {
        cout<<"相等"<<endl;
    }
    else
    {
        cout<<"不相等"<<endl;
    }




    return 0;
}

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69946337/viewspace-2682716/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-08-23

  • 博文量
    410
  • 访问量
    276760