運算子過載函式作為類成員函式與友元函式的區別
阿新 • • 發佈:2019-02-13
運算子過載函式作為類成員函式與友元函式
最近在學習C++的基礎,簡單地記一些筆記。
關於運算子過載函式作為成員函式還是友元函式的注意點:
當運算子過載函式作為類的成員函式時,要求運算元左邊必須是一個物件,而函式的引數可以是同類的物件也可以是普通的變數。這要看具體的問題具體分析,比如下面的例子:
//作為類成員函式定義:
Complex operator+(Complex &c1){
return new Complex(this.real+c1.real,this.image+c1.image);
}
//呼叫:
(1)c3 = c1+c2; 即 c3 = c1.operator +(c2) //正確
(2)c3 = c1+5; 函式原型:Complex operator+(int i){} //正確
(3)c3 = 5+c1; //錯誤
以上第三種呼叫方式顯然不能利用定義的過載運算子的,這是因為沒有辦法呼叫i.operator+(c1)。那麼如果想要這麼做,只能作為類的非成員函式,而且當要訪問的資料為物件的私有成員函式時,則必須宣告為類的友元函式。
過載運算子的規則
不允許使用者自定義新的運算子,只能對已有的運算子進行過載
過載運算子不允許改變運算子原運算元的個數
過載運算子不能改變運算子的優先順序
過載運算子函式不能有預設的引數,會導致引數個數不匹配
過載雙目運算子(略:可參照以上的規則直接過載)
過載單目運算子(主要學習一下前置自增和後置自增)
Time Time::operator++(){ //前置自增
if(++sec >= 60){
sec -= 60;
minute ++ ;
}
return *this;
}
Time Time::operator++(int){ //後置自增
Time temp(*this);
sec ++ ;
if(sec >= 60){
sec -= 60;
minute ++ ;
}
return temp;
}
區別:前置自增是返回自加後的自己,而後置自增是先返回未增加前的物件,然後物件再自加
比如:
int main(){
Time t1(34,59),t2;
cout<<"time1 : ";
t1.display();
++t1;
cout<<"time1 : ";
t1.display();
t2 = t1++;
cout<<"time1 : ";
t1.display();
cout<<"time2 : ";
t2.display();
}
輸出如下:
time1 : 34:59
++time : 35:0
time1++ : 35:1
t2 : 35:0
過載流插入運算子和流提取運算子
必須宣告為該類的友元函式,原型如下:
friend ostream & operator<<(ostream &output,Complex &c);
friend istream & istream>>(istream &input,Complex &c);
完