http://www.cnblogs.com/CaiNiaoZJ/archive/2011/08/13/2137033.html
上一節(jié)主要講解了C++里運算符重載函數(shù),在看了單目運算符(++)重載的示例后,,也許有些朋友會問這樣的問題,。++自增運算符在C或C++中既可以放在操作數(shù)之前,也可以放在操作數(shù)之后,但是前置和后置的作用又是完全不同的(q前置運算符:先加1,再賦值;后置運算符:先賦值,,再加1)。那么要怎么重載它們,,才可以有效的區(qū)分開來呢,?今天我就來說說C++中是怎么處理前置運算符和后置運算符的重載的。以及介紹一下插入運算符(>>)和提取運算符(<<)的重載,。
1.在C++里編譯器是根據(jù)運算符重載函數(shù)參數(shù)表里是否插入關(guān)鍵字int來區(qū)分前置還是后置運算,。比如:
1 #include "stdafx.h" 2 #include <iostream> 3 4 class TDPoint//三維坐標 5 { 6 private: 7 int x; 8 int y; 9 int z; 10 public: 11 TDPoint(int x=0,int y=0,int z=0) 12 { 13 this->x=x; 14 this->y=y; 15 this->z=z; 16 } 17 TDPoint operator++();//成員函數(shù)重載前置運算符++ 18 TDPoint operator++(int);//成員函數(shù)重載后置運算符++ 19 friend TDPoint operator++(TDPoint& point);//友元函數(shù)重載前置運算符++ 20 friend TDPoint operator++(TDPoint& point,int);//友元函數(shù)重載后置運算符++ 21 void showPoint(); 22 }; 23 24 TDPoint TDPoint::operator++() 25 { 26 ++this->x; 27 ++this->y; 28 ++this->z; 29 return*this;//返回自增后的對象 30 } 31 32 TDPoint TDPoint::operator++(int) 33 { 34 TDPoint point(*this); 35 this->x++; 36 this->y++; 37 this->z++; 38 return point;//返回自增前的對象 39 } 40 41 TDPoint operator++(TDPoint& point) 42 { 43 ++point.x; 44 ++point.y; 45 ++point.z; 46 return point;//返回自增后的對象 47 } 48 49 TDPoint operator++(TDPoint& point,int) 50 { 51 TDPoint point1(point); 52 point.x++; 53 point.y++; 54 point.z++; 55 return point1;//返回自增前的對象 56 } 57 58 void TDPoint::showPoint() 59 { 60 std::cout<<"("<<x<<","<<y<<","<<z<<")"<<std::endl; 61 } 62 63 int main() 64 { 65 TDPoint point(1,1,1); 66 point.operator++();//或++point 67 point.showPoint();//前置++運算結(jié)果 68 69 point=point.operator++(0);//或point=point++ 70 point.showPoint();//后置++運算結(jié)果 71 72 operator++(point);//或++point; 73 point.showPoint();//前置++運算結(jié)果 74 75 point=operator++(point,0);//或point=point++; 76 point.showPoint();//后置++運算結(jié)果 77 78 return0; 79 }
結(jié)果:
從示例代碼里可以清楚的看出,后置運算符重載函數(shù)比前置運算符重載函數(shù)多了一個int類型的參數(shù),,這個參數(shù)只是為了區(qū)別前置和后置運算符,,此外沒有任何作用。所以在調(diào)用后置運算符重載函數(shù)時,,int類型的實參可以取任意值,。
2.在C++中,操作符"<<"和">>"被定義為左位移運算符和右位移運算符,。由于在iostream頭文件中對它們進行了重載,,使得它們可以用基本數(shù)據(jù)的輸出和輸入。
#include "stdafx.h" #include <iostream>
int main() { int a=10; std::cout<<"a="<<a<<std::endl;//運算符"<<"重載后用于輸出 a=a>>2;//右移運算符 std::cout<<"右移2位:a="<<a<<std::endl;
std::cout<<"請輸入一個整數(shù)a:"; std::cin>>a;//運算符">>"重載后用于輸入 a=a<<2;//左移運算符 std::cout<<"左移2位:a="<<a<<std::endl;
return0; }
結(jié)果:
插入運算符"<<"是雙目運算符,,左操作數(shù)為輸出流類ostream的對象,,右操作數(shù)為系統(tǒng)預(yù)定義的基本類型數(shù)據(jù)。頭文件 iostrem對其重載的函數(shù)原型為ostream& operator<<(ostream& ,類型名);類型名就是指基本類型數(shù)據(jù),。但如果要輸出用戶自定義的類型數(shù)據(jù)的話,,就需要重載操作符"<<",因為該操作符的左操作數(shù)一定為 ostream類的對象,,所以插入運算符"<<"只能是類的友元函數(shù)或普通函數(shù),,不能是其他類的成員函數(shù)。一般定義格式:
ostream& operator<<(ostream& ,自定義類名&);
提取運算符">>"也是如此,,左操作數(shù)為istream類的對象,右操作數(shù)為基本類型數(shù)據(jù),。頭文件iostrem對其重載的函數(shù)原型為 istream& operator>>(istream& ,類型名);提取運算符也不能作為其他類的成員函數(shù),,可以是友元函數(shù)或普通函數(shù)。它的一般定義格式為:
istream& operator>>(istream& ,自定義類名&);
我還是用上一節(jié)用的Complex類(復(fù)數(shù)類)來舉例:
#include "stdafx.h" #include <iostream>
class Complex //復(fù)數(shù)類 { private://私有 double real;//實數(shù) double imag;//虛數(shù) public: Complex(double real=0,double imag=0) { this->real=real; this->imag=imag; } friend std::ostream&operator<<(std::ostream& o,Complex& com);//友元函數(shù)重載提取運算符"<<" friend std::istream&operator>>(std::istream& i,Complex& com);//友元函數(shù)重載插入運算符">>" };
std::ostream&operator<<(std::ostream& o,Complex& com) { std::cout<<"輸入的復(fù)數(shù):"; o<<com.real; if(com.imag>0) o<<"+"; if(com.imag!=0) o<<com.imag<<"i"<<std::endl; return o; }
std::istream&operator>>(std::istream& i,Complex& com) { std::cout<<"請輸入一個復(fù)數(shù):"<<std::endl; std::cout<<"real(實數(shù)):"; i>>com.real; std::cout<<"imag(虛數(shù)):"; i>>com.imag; return i; }
int main() {
Complex com; std::cin>>com; std::cout<<com;
return0; }
結(jié)果:
|