欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

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

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

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

using namespace std;

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

public:
    MyInteger() {m_Num = 0;
    }

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

private:
    int m_Num;
};

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

void test() {MyInteger mi;
    cout<< ++(++mi)<< endl;//C++里面原生的前置遞增可以鏈?zhǔn)秸{(diào)用,后置遞增不可以鏈?zhǔn)秸{(diào)用
}

int main() {//    test();
    //C++里面原生的前置遞增可以鏈?zhǔn)秸{(diào)用,后置遞增不可以鏈?zhǔn)秸{(diào)用
    int a = 0;
    ++(++a);
    cout<< a<< endl;//輸出2
    return 0;
}
2

后置遞增
C++里面后置++是不能鏈?zhǔn)秸{(diào)用的

#include "iostream"

using namespace std;

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

public:
    MyInteger() {m_Num = 0;
    }

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

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

private:
    int m_Num;
};

//重載左移運(yùn)算符
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

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

#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;
}

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

在這里插入圖片描述

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

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

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

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

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

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

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

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

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

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

網(wǎng)站名稱:CPP核心編程4-重載遞增運(yùn)算符-創(chuàng)新互聯(lián)
瀏覽地址:http://chinadenli.net/article26/dihpjg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航、網(wǎng)站設(shè)計公司網(wǎng)站收錄、品牌網(wǎng)站制作、服務(wù)器托管、網(wǎng)站維護(hù)

廣告

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

成都網(wǎng)頁設(shè)計公司