在(五)我們已經介紹了過載賦值運算子,這裡就不重新說明了。
一。作為類成員函式的過載
為了能進行類物件和乙個整型值的加法運算,需要寫乙個類的成員函式來過載雙目加法(+)運算子。該函式在類中的宣告如下:
date operator + (int) const;
函式的宣告指出,返回值是乙個date類物件,函式名是運算子+,只有乙個整型引數,而且函式是常量型的。當編譯器發現某個函式以加上字首operator的真實運算子作為函式名,就會把該函式當作過載運算子函式來處理。如果在表示式中,該運算子的左邊是乙個類物件,右邊是乙個引數型別的乙個物件,那麼過載運算子函式就會被呼叫。呼叫形式如下:
date dt(6,9,2005);
dt=dt+100;
也可以顯式的呼叫過載運算子函式:
dt.operator + (100);
下面**過載了雙目加法運算子來計算乙個整數和乙個date類物件之和,並且返回date類物件。
#include iostream.h
class date
void display() const
}dt.da=n;
return dt;
}int main()
二。非類成員的運算子過載
在過載運算子的原則中說到,要保持運算子的可交換性。而上面的程式只允許date類物件在運算子的左邊而整型值在右邊,不支援下面的語句:
date newdate=100+olddate;
所以,僅僅靠乙個類的成員過載運算子是無法實現上面功能的。對過載雙目運算子的類成員函式來說,總是認定呼叫函式的物件位於運算子左邊。不過,我們可以再寫乙個非類成員的過載運算子函式,可以規定date類的物件在運算子右邊,而別的型別在運算子左邊。例如,我們可以這樣在類的外部定義乙個函式:
date operator + (int n,date& dt)
下面**在原先的基礎上增加了乙個非類成員函式來實現雙目加法運算子的過載。
#include iostream.h
class date
void display() const
}dt.da=n;
return dt;
}date operator + (int n,date& dt)
int main()
上面的例子中非類成員過載運算子函式呼叫了類中的過載+運算子來實現加法運算。如果類當中沒有提供這樣的函式,那麼非類成員的過載運算子函式將被迫訪問類的私有資料來實現加法運算。這樣的話,需要把這個函式宣告為類的友元,如下:
class date
;上例中過載運算子函式宣告了全部兩個引數,這是因為它不是類的成員,因此它不能作為類的成員函式被呼叫,就缺少了乙個隱含的引數。
第乙個過載加法運算子函式也可以用類的友元函式來實現。作為一種約定,這通常把所有為類過載的運算子都設定為該類的友元。
例子中只給出了過載加法的**,我們同樣可以來過載減法,乘除法等等。
三。過載關係運算子
如果想要對兩個日期進行比較,比如出現下面這樣的**:
if(olddatemo==dt.mo && this->da==dt.da && this->yr==dt.yr);
}int date::operator < (date& dt) const
return this->yr < dt.yr;
}int main()
}dt.da=n;
return dt;
}int main()
過載雙目運算子
include include using namespace std class string 定義預設建構函式 string char str 建構函式過載 friend bool operator string string1,string string2 friend bool operat...
十三 雙目運算子過載(C )
內容參考於 21天學通c 第八版 不去糾結c 的原理和細節,從c的角度去學習c 再通過c 專案去加深理解 以類成員的方式實現的雙目運算子只接受乙個引數,其原因是第二個引數通常是從類屬性獲得的。1.示例 include using namespace std class date date opera...
C 運算子過載 11 過載 和 操作符
運算子 用於流輸出,而運算子 用於流輸出。在開始過載這些操作符之前,必須注意下面的事項 1 cout是輸出類的物件,而cin是輸入類的物件 2 這些操作符必須過載為全域性函式。如果想要讓它們可以訪問私有成員,則必須定義為友元。為何必須過載為全域性函式?如果操作符過載為乙個成員函式,則它必須是物件的成...