1. 程式人生 > >運算子過載函式作為類成員函式與友元函式的區別

運算子過載函式作為類成員函式與友元函式的區別

運算子過載函式作為類成員函式與友元函式

最近在學習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);