程序設計實習MOOC/自增和自減運算符的重載

自增和自減運算符的重載

問題

編寫CDemo類,使得下面程序能夠正常運行ios

int main(){
    CDemo d(5);
    cout << (d++) << ",";
    cout << d << ",";
    cout << (++d) << ",";
    cout << d << endl;
    cout << (d--) << ",";
    cout << d << ",";
    cout << (--d) << ",";
    cout << d << endl;
    return 0;
}

輸出結果

5,6,7,7
7,6,5,5

分析

自增++自減--運算符有前置和後置之分,爲了區分,後置運算符多一個參數int。
前置運算符:做爲一元運算符重載,能夠重載爲成員函數也能夠重載爲全局函數(返回值究竟是不是引用?)。
後置運算符:做爲二元運算符重載,多寫一個參數int,可是沒有實際意義。能夠重載爲成員函數也能夠重載爲全局函數。返回值不是引用!不是引用!不是引用!函數

強調:後置運算符多一個參數int,返回值不是引用。

爲了cout能夠正常輸出,重載類型強制轉換運算符int做爲成員函數。this

類型強制轉換運算符重載spa

不能寫返回值類型
實際上其返回值類型爲類型強制轉換運算符表明的類型

運算符重載的注意事項code

  1. C++不容許定義新的運算符
  2. 重載後運算符的含義應該符合平常習慣
  3. 運算符重載不改變運算符的優先級
  4. 如下運算符不可以被重載:. .* :: ?: sizeof
  5. 如下運算符重載是必須聲明爲類的成員函數:() [] ->
  6. 流提取>>和流插入<<運算符只能重載爲全局函數,第一個參數ostream對象必須爲引用。

完整代碼

#include<iostream>
using namespace std;
class CDemo{
public:
    CDemo(int num = 0):n(num){}
    CDemo operator++();                     //前置++,成員函數
    CDemo operator++(int);                  //後置++,成員函數
    friend CDemo operator--(CDemo&);        //前置--,友元函數
    friend CDemo operator--(CDemo&, int);   //後置--,友元函數
    operator int(){                         //強制類型轉換運算符重載
        return n;
    }
//    friend ostream& operator<<(ostream& co, const CDemo& d);
//    friend istream& operator>>(istream& ci, CDemo& d);
private:
    int n;
};
//前置++
CDemo CDemo::operator++(){
    n++;
    return *this;
}
//後置++
CDemo CDemo::operator++(int){
    CDemo temp(*this);
    n++;
    return temp;
}
//前置--
CDemo operator--(CDemo& d){
    d.n--;
    return d;
}
//後置--
CDemo operator--(CDemo& d, int){
    CDemo temp(d);
    d.n--;
    return temp;
}
//ostream& operator<<(ostream& co, const CDemo& d){
//    co << d.n;
//    return co;
//}
//istream& operator>>(istream& ci, CDemo& d){
//    ci >> d.n;
//    return ci;
//}
int main(){
    CDemo d(5);
    cout << (d++) << ",";
    cout << d << ",";
    cout << (++d) << ",";
    cout << d << endl;
    cout << (d--) << ",";
    cout << d << ",";
    cout << (--d) << ",";
    cout << d << endl;
    return 0;
}
相關文章
相關標籤/搜索