1.C++中重载++操作符,
C++中重载前++操作符,使用成员函数重载,
,用如下形式:
<类名> operator ++()
{
···// 函数体
}
用成员函数重载后++操作符,形式为:
<类名> operator ++(int)
{
···// 函数体
}
它们的区别在于,后++操作符的形参表多了一个int,在调用时,前++操作符的调用方法为 对象名.operator++(),后++的调用方法为 对象名.operator
++(0)。
下面的代码实现了重载++ -- [] *操作符。
# include <iostream> using namespace std; # include <vector> template<typename T> class Check{ public: Check(T *b,T* e):beg(b),end(e),curr(b){} Check &operator ++(); Check &operator --(); Check &operator ++(int); Check &operator --(int); T& operator [](const size_t index); const T& operator [](const size_t index) const; T &operator*() const; private: T *beg; T *end; T *curr; }; template <typename T> Check <T> & Check<T>::operator++() { if(curr==end) throw out_of_range("increment past the end of check"); curr++; return *this; } template <typename T> Check <T>& Check<T>::operator--() { if(curr==beg) throw out_of_range("decrement past the head of check"); curr--; return *this; } template <typename T> Check <T>& Check<T>::operator++(int) { Check t(*this); ++*this; return t; } template <typename T> Check <T> & Check <T>::operator--(int) { Check t(*this); --(*this); return t; } template <typename T> T& Check <T>::operator[](const size_t index) { if (beg+index>end) throw out_of_range("out of range"); return *(beg+index); } template <typename T> const T & Check <T>::operator[](const size_t index) const { if(beg+index>end) throw out_of_range("index out of range"); return *(beg+index); } template <class T> T & Check<T>::operator *() const { if(curr==end) throw out_of_range("index out of range"); return *curr; } int main() { int a[10]={1,2,3,4,5,6,7,8,9,0}; const Check <int> t(a,a+10); Check <int> t2(a,a+10); Check <int> t3(a,a+3); cout<<*t<<endl; t3=t2.operator++(); cout<<*t3<<endl; t2.operator--(); Check <int> t4(a,a+5); t4=t2.operator++(0); cout<<*t4<<endl; cout<<t4.operator[](2)<<endl; cin.get(); return 0; }
2 重载<<操作符
当定义符合标准库iostream规范的输入或输出操作符的时候,必须定义为友元操作符,否则,左操作数将只能是该类类型的对象。
Sales_item item;
Item <<cout;
这个用法与为其它类型定义的输出操作符的正常使用方式相反。类通常将IO操作符设为友元。
# include <iostream> using namespace std; class test { public: test(int i):x(i){} friend ostream& operator<<(ostream & os,test & a); int getx(){return x;} private: int x; }; ostream& operator<<(ostream & os,test & a) { os<<a.getx()<<endl; return os; } int main() { test a(1); cout<<a; cin.get(); return 0; }