C++自增自減過載
阿新 • • 發佈:2019-02-17
#include <iostream>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
//前置運算子 ++i
//過載為成員函式
//T operator++()
//T operator--()
//過載全域性函式
//T operator++(T)
//T operator--(T)
//呼叫的形式有 ++obj obj.operato4r++() operator++(obj)
//後置運算子作為二元運算子過載 i++
//多寫一個引數 具體無意義
//過載為成員函式 T operator++(int) T operator--(int)
//過載為全域性函式 T operator++(T, int) T operator--(T,int)
//呼叫形式有 obj++ obj.operator++(0) operator(obj,0)
class CDemo{
private:
int n;
public:
CDemo(int i = 0):n(i){}
CDemo operator++();//用於前置形式
CDemo operator++(int);//用於後置形式
operator int(){ return n;} //過載括號運算子 強制型別轉換符號
friend CDemo operator--(CDemo&);//用於前置形式
friend CDemo operator--(CDemo&,int);//用於後置形式
};
CDemo CDemo::operator++(){//前置++
n++;
return *this;
}
CDemo CDemo::operator++(int k){//後置++
CDemo tmp(*this);//儲存修改前的物件 淺複製
n++;
return tmp; //返回修改前的物件
}
CDemo operator--(CDemo& d){//前置--
d.n--;
return d;
}
CDemo operator--(CDemo& d,int){//後置--
CDemo tmp(d);
d.n--;
return tmp;
}
/*
operator int(){ return n;}
int 作為一個型別強制轉換運算子被過載
Demo s;
(int) s;//等效與s.int();
型別強制轉換運算子過載時
不能寫返回值型別
實際上其返回值型別--型別強制轉換運算子代表的型別
*/
int main(int argc, char** argv) {
CDemo d(5);
cout<<(d++)<<",";//等價於d.operator(0)
cout<<d<<",";//過載<< 為全域性函式
cout<<(++d)<<",";//等價於d.operator++()
cout<<d<<endl;
cout<<(d--)<<",";//等價於operator--(d,0)
cout<<d<<",";//
cout<<(--d)<<",";//等價於operator--(d)
cout<<d<<endl;
return 0;
}
/*
運算子過載注意事項
1 C++不允許定義新的運算子
過載後的運算子的含義符合日常習慣
運算子過載不改變運算子優先級別
**以下運算子不能被過載: . .* :: ?: sizeof
**過載運算子() [] -> 或者賦值運算子=時,過載函式必須宣告為類的成員函式。
*/
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
//前置運算子 ++i
//過載為成員函式
//T operator++()
//T operator--()
//過載全域性函式
//T operator++(T)
//T operator--(T)
//呼叫的形式有 ++obj obj.operato4r++() operator++(obj)
//後置運算子作為二元運算子過載 i++
//多寫一個引數 具體無意義
//過載為成員函式 T operator++(int) T operator--(int)
//過載為全域性函式 T operator++(T, int) T operator--(T,int)
//呼叫形式有 obj++ obj.operator++(0) operator(obj,0)
class CDemo{
private:
int n;
public:
CDemo(int i = 0):n(i){}
CDemo operator++();//用於前置形式
CDemo operator++(int);//用於後置形式
operator int(){ return n;} //過載括號運算子 強制型別轉換符號
friend CDemo operator--(CDemo&);//用於前置形式
friend CDemo operator--(CDemo&,int);//用於後置形式
};
CDemo CDemo::operator++(){//前置++
n++;
return *this;
}
CDemo CDemo::operator++(int k){//後置++
CDemo tmp(*this);//儲存修改前的物件 淺複製
n++;
return tmp; //返回修改前的物件
}
CDemo operator--(CDemo& d){//前置--
d.n--;
return d;
}
CDemo operator--(CDemo& d,int){//後置--
CDemo tmp(d);
d.n--;
return tmp;
}
/*
operator int(){ return n;}
int 作為一個型別強制轉換運算子被過載
Demo s;
(int) s;//等效與s.int();
型別強制轉換運算子過載時
不能寫返回值型別
實際上其返回值型別--型別強制轉換運算子代表的型別
*/
int main(int argc, char** argv) {
CDemo d(5);
cout<<(d++)<<",";//等價於d.operator(0)
cout<<d<<",";//過載<< 為全域性函式
cout<<(++d)<<",";//等價於d.operator++()
cout<<d<<endl;
cout<<(d--)<<",";//等價於operator--(d,0)
cout<<d<<",";//
cout<<(--d)<<",";//等價於operator--(d)
cout<<d<<endl;
return 0;
}
/*
運算子過載注意事項
1 C++不允許定義新的運算子
過載後的運算子的含義符合日常習慣
運算子過載不改變運算子優先級別
**以下運算子不能被過載: . .* :: ?: sizeof
**過載運算子() [] -> 或者賦值運算子=時,過載函式必須宣告為類的成員函式。
*/