C++ 操作符重載(小結 持續更新ing )(歡迎收藏)

  • 操作符重載一個原則是:被操作的數據類型中 至少有一個是自定義的類型(使用class定義類),如果被操作的變量都是基本類型,那麼就不能定義操作符重載。

如果重載了new,則必須重載delete,因爲系統知道了你自定義了怎麼new一個空間, 但是呢,你使用delete的時候,系統並不知道怎麼delete你所自定義申請的空間。


類內定義與友元函數定義原則:

  • 對於二元操作符:二元操作符如果操作符左面是自定義類,那麼直接在類裏面實現重載函數即可;
  • ​​​​​如果左邊是標準變量(標準變量無法調用重載函數),右邊是自定義類,那麼就將重載函數設置爲友元函數。重載函數在自定義類的外部定義實現。

強制轉化操作符重載:

  C++不但允許重載運算操作符,還可以重載強制類型轉換操作符,不過強制類型轉換必須是C++基本數據類型之一,如int,float,char *等,強制類型轉換注意以下幾點:

  1、定義函數時不允許有參數,不允許有返回類型,但函數必須返回所需類型的值

  2、重載函數只可以是類成員函數,不可以爲非類成員函數

operator int()//不能指定返回值
{
    return 整形變量;
}
operator int* ()
{
    return 整形變量地址;
}

最後放代碼:(分析代碼纔是最快的捷徑)

#include <iostream>
#include<string.h>
#include<stdlib.h>
using namespace std;
/*操作符重載一個原則是:被操作的數據類型,至少有一個是自定義的類型,
 * 如果被操作的變量都是基本類型,那麼就不能定義操作符重載*/
class mystring
{
public:
    char *s;
    //一元操作符重載
    //重載1
    mystring operator=(const mystring &it)
    {   memset(s,0,1024);
        strcpy(s,it.s);
        return *this;
    }
    //重載2
    mystring operator+(const mystring &str)
    {
        strcat(s,str.s);
        return *this;
    }
    //重載3
    mystring operator + (const char *str)
    {
        strcat(s,str);
        return *this;
    }
    friend mystring operator + (const char *str,const mystring &it);

    //重載5
    mystring operator +=(const char *str)
    {
        strcat(s,str);
        return *this;
    }

    //重載6:<<作爲簡單的賦值操作
    void operator<<(const char *str)
    {
        strcpy(s,str);
    }

    //重載7:>>作爲簡單的賦值操作
    void operator>>(const char *str)
    {
        strcpy(str,s);
    }

    //重載8:new(必須有空格)
    /*如果重載了new,則必須重載delete,因爲系統知道了你自定義了怎麼new一個空間,
     * 但是呢你使用delete的時候,系統並不知道怎麼delete你所自定義申請的空間。*/
    void * operator new(size_t size)
    {
        mystring *p =(mystring *)malloc(size);
        return p;
    }

    //重載9:delete
    void operator delete(void *obj)
    {
        //free(obj) //C:語言不能直接free一個void*類型,他不知道有多大內存要釋放
        free((mystring*)obj);//使用強制類型轉換
        obj=NULL;//防止野指針
    }

    //重載10:new[]
    void *operator new[](size_t size)//size總比實際分配空間大4個字節,存放一些系統內部的處理數據,也就是delete[]釋放內存所需要的數據
    {
        mystring *p=(mystring *)malloc(size);
        return p;
    }
    //重載10;delete[]
    void operator delete[](void *obj)
    {
        free((mystring*)obj);
        obj=NULL;
    }

    //重載11:==(左邊是自定義類,是一元重載)
    bool operator==(const mystring &it)
    {
        if(strcmp(s,it.s)==0)//判斷二者的字符串是否相等。
            return true;
        else {
            return false;
        }
    }
    //設置友元函數
    friend bool operator==(const char* str,const mystring &it);
};


/*二元操作符:二元操作符如果操作符左面是類,那麼直接在類裏面實現重載函數即可,
如果左邊是標準變量(標準變量無法調用重載函數)
右邊是自定義類,那麼就將重載函數設置爲友元函數。
*/
//重載4
mystring operator + (const char *str,const mystring &it)
{
    char buf[1024]={0};
    mystring str1;
    sprintf(buf,"%s%s",str,it.s);
    strcpy(str1,buf);
    return str1;
}

//重載12:==(左邊是一個普通的變量類型),定義二元重載函數,在類內部需要設置友元函數
bool operator==(const char* str,const mystring &it)
{
    if(strcmp(str,it.s)==0)
        return true;
    else {
        return false;
    }
}


int main()
{
    mystring str1;
    str1.s="hello";

    //使用重載1
    mystring str2 = str1;
    cout<<str2.s<<endl;

    //使用重載1,2
    mystring str3;
    mystring str4;
    str4.s=" C++";
    str3 = str2 + str4;
    cout<<str3.s<<endl;
    //使用操作符3
    mystring str5;
    str5.s="hello5 ";
    str5=str5+"c++5";
    cout<<str5.s<<endl;
    //使用重載8,9
    mystring *str6 = new mystring;
    delete str6;
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章