CPP核心編程4-重載遞增運算符-創(chuàng)新互聯

在這里插入圖片描述
在這里插入圖片描述

專注于為中小企業(yè)提供成都網站建設、成都網站制作服務,電腦端+手機端+微信端的三站合一,更高效的管理,為中小企業(yè)元寶山免費做網站提供優(yōu)質的服務。我們立足成都,凝聚了一批互聯網行業(yè)人才,有力地推動了上千多家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網站建設實現規(guī)模擴充和轉變。
#include "iostream"

using namespace std;

//遞增運算符重載
//自定義整型
class MyInteger {friend ostream &operator<<(ostream &cout, MyInteger mi);

public:
    MyInteger() {m_Num = 0;
    }

    //重置前置++運算符  返回引用是為了對同一個數進行操作
    MyInteger &operator++() {//這里不能返回值MyInteger 必須返回MyInteger&  因為操作的需要是都一個對象,返回值就是拷貝了
        //先進行++運算
        m_Num++;
        //再將自身作返回
        return *this;
    }
    //重置后置++運算符

private:
    int m_Num;
};

//重載左移運算符
ostream &operator<<(ostream &cout, MyInteger mi) {cout<< mi.m_Num;
    return cout;
}

void test() {MyInteger mi;
    cout<< ++(++mi)<< endl;//C++里面原生的前置遞增可以鏈式調用,后置遞增不可以鏈式調用
}

int main() {//    test();
    //C++里面原生的前置遞增可以鏈式調用,后置遞增不可以鏈式調用
    int a = 0;
    ++(++a);
    cout<< a<< endl;//輸出2
    return 0;
}
2

后置遞增
C++里面后置++是不能鏈式調用的

#include "iostream"

using namespace std;

//遞增運算符重載
//自定義整型
class MyInteger {friend ostream &operator<<(ostream &cout, MyInteger mi);

public:
    MyInteger() {m_Num = 0;
    }

    //重置前置++運算符  返回引用是為了對同一個數進行操作
    MyInteger &operator++() {//這里不能返回值MyInteger 必須返回MyInteger&  因為操作的需要是都一個對象,返回值就是拷貝了
        //先進行++運算
        m_Num++;
        //再將自身作返回
        return *this;
    }

    //重置后置++運算符   ?。。。。?!之前學習的占位符終于找到用武之地了
    //返回值用const修飾,他能防止一些問題,例如: (p++)++
    const MyInteger operator++(int) {//int 代表占位參數,可以用于區(qū)分前置和后置遞增,這里只能是int,double等不好使
        MyInteger temp = *this;
        m_Num++;
        return temp;
    }

private:
    int m_Num;
};

//重載左移運算符
ostream &operator<<(ostream &cout, MyInteger mi) {cout<< mi.m_Num;
    return cout;
}

void test() {MyInteger mi;
//    cout<< ++(++mi)<< endl;
    cout<< mi++<< endl;//輸出0   //返回值用const修飾,他能防止一些問題,例如: (p++)++
    cout<< mi<< endl;//輸出1
}

int main() {test();
    return 0;
}
0
1

遞增運算符分為前置遞增和后置遞增。這兩個分開來說吧。
前置遞增。
需要創(chuàng)建一個名字叫做 人 的類,這個類中有一個 年齡 屬性,且默認值為0,然后類外重載左移運算符方便打印輸出。我們對人類的對象進行遞增操作就是想讓年齡增加。如下:

#includeusing namespace std;

class Person
{public:
int age = 0;
Person& operator++()//**1**
{age += 1;
return *this;
}
};
ostream& operator<<(ostream& cout, const Person &p)
{cout<< p.age;
return cout;
}
void test1()
{Person p;
cout<< "++p = "<< ++p<< endl;
cout<< "++(++p) = "<< ++(++p)<< endl;
cout<< "p = "<< p<< endl;
}
int main()
{test1();
system("pause");
return 0;
}

第一個問題 :返回值為什么是引用?
答案:因為前置遞增運算符可以這樣使用:++(++p)。即進行兩次連續(xù)的遞增操作。若返回值為一個對象,則會產生一個匿名對象,之后++操作是對匿名獨對象進行++操作。結果如下:
第二個問題 :為什么這是前置遞增,不應該是后置遞增嗎?
首先解釋一下問題,還是舉個例子吧。
加運算符在類內實現重載的寫法:Person operator+(Person &p);
當你調用的時候,如:p1 + p2,其本質調用是 p1.operator+(p2); 。你會發(fā)現,是 +號前面的對象調用函數,加號后面的對象是參數 。所以,當我們調用Person& operator++();的時候,是不是應該寫 p1++??
答案:(個人推測)可能和后置遞增有關。為了區(qū)分前置和后置。

在這里插入圖片描述

后置遞增。
第一個問題 :是后置遞增類內重載的寫法遇到的問題:
返回值和參數都是啥??想這樣寫??

Person operator++();
Person& operator++();
Person operator++(Person& p);
....

想了好久,也沒想出來該怎么寫。
答案:const Person operator++(int)
其中int的作用是占位符,為了和前置遞增區(qū)分開來,而且只能寫int,寫double、float等都是不行的。因為沒有這個占位參數的話,該函數與前置遞增就只有返回值不同了,而返回值是不可以作為函數重載的條件的。
至于返回值的為什么是Person話,而且還用const修飾,在下一個問題中說明。
第二個問題 具體是怎樣實現的,畢竟后置遞增和前置遞增還是有區(qū)別的。
答案:

const Person operator++(int)
{Person p = *this;
age += 1;
return p;
}

首先創(chuàng)建一個臨時的對象,用來保存當前值,因為該函數最后返回的不是遞增后的結果,而是遞增之前的值。
然后,屬性加一,完成遞增操作。
最后,返回臨時對象
注意1: 此時的temp是一個臨時對象,該函數運行結束后就會被編譯器回收,所以我們直接返回temp的引用。我們需要進行值返回,值返回的話會調用拷貝構造函數重新創(chuàng)建一個對象。
注意2: 返回值用const修飾,他能防止一些問題,例如: (p++)++ 。我們可以做一個小測試。

int p = 0;
cout<< "(p++)++ = "<< (p++)++<< endl;
cout<< "p = "<< p<< endl;

我們預想的結果可能是輸出:(p++)++ = 1 p = 2
但實際結果是這樣的:
報錯了,原因是++需要可修改的左值。從結果我們可以知道,表達式p++的結果是不允許被修改的,所以我們后置遞增的返回值是const類型的。
那么為什么會這樣呢?
同樣舉個例子:
在這里插入圖片描述

int p;
cout<< "p = "<< p<< endl;
cout<< "p++ = "<< p++<< endl;
cout<< "p = "<< p<< endl;

運行結果如下:
我們輸出 p++ 的結果是0,這個0是哪里來的呢??是變量p中存儲的嗎??并不是,此時p中存儲的值已經被改變了,這個0是產生的一個臨時值。這個臨時值在內存中的位置是未知的,我們無法對其進行修改。
所以,當我們 (p++)++ 這樣使用后置遞增運算符的時候,相當于嘗試修改臨時變量的值,這是不被允許的。
所以,我們重載遞增操作符的返回值要用const來修飾。
在這里插入圖片描述

你是否還在尋找穩(wěn)定的海外服務器提供商?創(chuàng)新互聯www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調度確保服務器高可用性,企業(yè)級服務器適合批量采購,新人活動首月15元起,快前往官網查看詳情吧

網站名稱:CPP核心編程4-重載遞增運算符-創(chuàng)新互聯
瀏覽地址:http://bm7419.com/article26/dihpjg.html

成都網站建設公司_創(chuàng)新互聯,為您提供面包屑導航、網站設計公司網站收錄、品牌網站制作、服務器托管網站維護

廣告

聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯

成都網頁設計公司