常用的過載運算子你瞭解幾個?

專注的阿熊發表於2020-03-26

知識點介紹
運算子過載,就是對已有的運算子重新進行定義,賦予其另一種功能,以適應不同的資料型別運算子過載的目的:簡化操作 讓已有的運算子 適應適應不同的資料型別。
簡單的介紹一下,接下來酒肉伺候~
由於比較多,故分檔案來實現
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部落格 ” ,連結:http://blog.itpub.net/69946337/viewspace-2682716/,如需轉載,請註明出處,否則將追究法律責任。

相關文章