c++——函數(shù)符號(hào)重載2-15

一般情況下,單目運(yùn)算符最好重載為類(lèi)的成員函數(shù);雙目運(yùn)算符則最好重載為類(lèi)的友元函數(shù)。
以下一些雙目運(yùn)算符不能重載為類(lèi)的友元函數(shù):=、()、[]、->。
類(lèi)型轉(zhuǎn)換函數(shù)只能定義為一個(gè)類(lèi)的成員函數(shù)而不能定義為類(lèi)的友元函數(shù)。 C++提供4個(gè)類(lèi)型轉(zhuǎn)換函數(shù):reinterpret_cast(在編譯期間實(shí)現(xiàn)轉(zhuǎn)換)、const_cast(在編譯期間實(shí)現(xiàn)轉(zhuǎn)換)、stactic_cast(在編譯期間實(shí)現(xiàn)轉(zhuǎn)換)、dynamic_cast(在運(yùn)行期間實(shí)現(xiàn)轉(zhuǎn)換,并可以返回轉(zhuǎn)換成功與否的標(biāo)志)。
若一個(gè)運(yùn)算符的操作需要修改對(duì)象的狀態(tài),選擇重載為成員函數(shù)較好。
若運(yùn)算符所需的操作數(shù)(尤其是第一個(gè)操作數(shù))希望有隱式類(lèi)型轉(zhuǎn)換,則只能選用友元函數(shù)。
當(dāng)運(yùn)算符函數(shù)是一個(gè)成員函數(shù)時(shí),最左邊的操作數(shù)(或者只有最左邊的操作數(shù))必須是運(yùn)算符類(lèi)的一個(gè)類(lèi)對(duì)象(或者是對(duì)該類(lèi)對(duì)象的引用)。如果左邊的操作數(shù)必須是一個(gè)不同類(lèi)的對(duì)象,或者是一個(gè)內(nèi)部 類(lèi)型的對(duì)象,該運(yùn)算符函數(shù)必須作為一個(gè)友元函數(shù)來(lái)實(shí)現(xiàn)。
當(dāng)需要重載運(yùn)算符具有可交換性時(shí),選擇重載為友元函數(shù)。

注意事項(xiàng):

除了類(lèi)屬關(guān)系運(yùn)算符”.“、成員指針運(yùn)算符”.*“、作用域運(yùn)算符”::“、sizeof運(yùn)算符和三目運(yùn)算符”?:“以外,C++中的所有運(yùn)算符都可以重載。
重載運(yùn)算符限制在C++語(yǔ)言中已有的運(yùn)算符范圍內(nèi)的允許重載的運(yùn)算符之中,不能創(chuàng)建新的運(yùn)算符。
運(yùn)算符重載實(shí)質(zhì)上是函數(shù)重載,因此編譯程序?qū)\(yùn)算符重載的選擇,遵循函數(shù)重載的選擇原則。
重載之后的運(yùn)算符不能改變運(yùn)算符的優(yōu)先級(jí)和結(jié)合性,也不能改變運(yùn)算符操作數(shù)的個(gè)數(shù)及語(yǔ)法結(jié)構(gòu)。
運(yùn)算符重載不能改變?cè)撨\(yùn)算符用于內(nèi)部類(lèi)型對(duì)象的含義。它只能和用戶自定義類(lèi)型的對(duì)象一起使用,或者用于用戶自定義類(lèi)型的對(duì)象和內(nèi)部類(lèi)型的對(duì)象混合使用時(shí)。
運(yùn)算符重載是針對(duì)新類(lèi)型數(shù)據(jù)的實(shí)際需要對(duì)原有運(yùn)算符進(jìn)行的適當(dāng)?shù)母脑?,重載的功能應(yīng)當(dāng)與原有功能相類(lèi)似,避免沒(méi)有目的地使用重載運(yùn)算符。
#include <iostream>
#include <string>
using namespace std;

class Douary
{
public:
    ~Douary(){cout << "~Douary()\n";}
    //explicit:防止隱式類(lèi)型轉(zhuǎn)換
    explicit  Douary(int real = 0, int vir = 0)
    {
        m_iRow = real;
        m_iCol = vir;
        //cout << "Douary(int,int)" << endl;
    }
    void show()
    {
        cout << m_iRow << '+' << m_iCol << endl;
    }


    friend Douary operator+ (const Douary &d1
                             , const Douary &d2);
    friend Douary operator- (const Douary &d1
                             , const Douary &d2);
    friend Douary operator* (const Douary &d1
                             , const Douary &d2);   
    friend Douary operator/ (const Douary &d1
                             , const Douary &d2);   
                             
                                                         
    friend ostream& operator <<(ostream& out
                                , const Douary &dou);
    friend istream& operator >>(istream &in
                    , Douary &dou);
private:
    int *Array;
    int m_iRow;
    int m_iCol;
};



Douary operator+(const Douary &d1, const Douary &d2)
{
    Douary dou;
    dou.m_iRow = d1.m_iRow + d2.m_iRow;
    dou.m_iCol = d1.m_iCol + d2.m_iCol;
    return dou;
}


Douary operator-(const Douary &d1, const Douary &d2)
{
    Douary dou;
    dou.m_iRow = d1.m_iRow - d2.m_iRow;
    dou.m_iCol = d1.m_iCol - d2.m_iCol;
    return dou;
}


Douary operator* (const Douary &d1, const Douary &d2)
{
    Douary dou;
    dou.m_iRow = d1.m_iRow * d2.m_iRow;
    dou.m_iCol = d1.m_iCol * d2.m_iCol;
    return dou;
}


Douary operator/ (const Douary &d1, const Douary &d2)
{
    Douary dou;
    dou.m_iRow = d1.m_iRow / d2.m_iRow;
    dou.m_iCol = d1.m_iCol / d2.m_iCol;
    return dou;
}


ostream& operator <<(ostream& out, const Douary &dou)
{

    out << dou.m_iRow << '+' << dou.m_iCol ;
    return out;
}

istream& operator >>(istream &in, Douary &dou)
{
    in >> dou.m_iRow >> dou.m_iCol;
    return in;
}

void fun(Douary dou)
{
    cout << dou << endl;
}

int main(void)
{

    Douary dou(12, 18);
    Douary dou1(2, 3);
    Douary dou2;

    dou2 = dou + dou1;  //-->dou2=dou+Douary(34);
    cout << dou2 << endl;
    
    dou2 = dou - dou1;
    cout << dou2 << endl;
    
    dou2 = dou * dou1;
    cout << dou2 << endl;
    
    dou2 = dou / dou1;
    cout << dou2 << endl;
    
    cin >> dou2 ;
    cout << dou2 << endl;

    return 0;
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy閱讀 9,674評(píng)論 1 51
  • C++運(yùn)算符重載-下篇 本章內(nèi)容:1. 運(yùn)算符重載的概述2. 重載算術(shù)運(yùn)算符3. 重載按位運(yùn)算符和二元邏輯運(yùn)算符4...
    Haley_2013閱讀 1,529評(píng)論 0 49
  • C++運(yùn)算符重載-上篇 本章內(nèi)容:1. 運(yùn)算符重載的概述2. 重載算術(shù)運(yùn)算符3. 重載按位運(yùn)算符和二元邏輯運(yùn)算符4...
    Haley_2013閱讀 2,385評(píng)論 0 51
  • 1. 呼呼 …… 嗖嗖 …… 風(fēng)兒呼嘯的吹,雨兒瑟瑟的追。 “老哥,你這抖得有點(diǎn)厲害啊,眼睛還一睜一閉的?要不要穿...
    睡衣守閱讀 256評(píng)論 0 0
  • 青椒小王子閱讀 291評(píng)論 0 0

友情鏈接更多精彩內(nèi)容