然而,單純的使用系統自帶的''==''來進行來兩個物件的相等判斷,是無法通過編譯的。
在此我們可以採用建立乙個判斷相等函式用以解決兩個物件的相等判斷:
class date
date(const date& d)
bool isequal(const date& d1)
private:
int _year;
int _month;
int _day;
};int main()
但是,採用函式定義來解決問題時,函式名能否「見名知意」是很關鍵的,在大多數情況之下,函式名會導致**可讀性不強。而運算子過載將''==''通過過載實現支援date型別的相等判斷,即可以大大提高**的可讀性。
c++為了增強**的可讀性引入了運算子過載,運算子過載是具有特殊函式名的函式,也具有其返回值型別,函式名字以及引數列表,其返回值型別與引數列表與普通的函式類似。
函式名字為:關鍵字operator後面接需要過載的運算子符號。
函式原型:返回值型別 operator操作符(引數列表)
注意:
1) 不能通過連線其他符號來建立新的操作符:比如operator@ ,對於原來沒有定義的運算子自己不允許創造出新的運算子。
2) 過載操作符必須有乙個類型別或者列舉型別的運算元 。
3) 用於內建型別的操作符,其含義不能改變,例如:內建的整型+,不能改變其含義 ,內建型別語言已經定義了其邏輯功能,不能對其做改變。運算子過載相當於在自定義型別中定義另一種邏輯。
4) 作為類成員的過載函式時,其形參看起來比運算元數目少1成員函式的
5) 操作符有乙個預設的形參this,限定為第乙個形參
6).*(成員訪問運算子) 、::(作用域限定運算子) 、sizeof(計算位元組大小運算子) 、?:(三目運算子) 、. (點號運算子)注意以上5個運算子不能過載。這個經常在筆試選擇題**現。
全域性函式(非成員函式)的''==''的運算子過載實現:
class date
date(const date& d)
public:
// 這裡會發現運算子過載成全域性的就需要成員變數是共有的,那麼問題來了,封裝性如何保證?
// 這裡其實可以用我們後面學習的友元解決,或者乾脆過載成成員函式。
int _year;
int _month;
int _day;
};bool operator==(date& d1, date& d2)
int main()
可以來比較一下**的可讀性:
cout << (d1 == d2) << endl; // 運算子過載
cout << d1.isequal(d2) << endl; // 函式呼叫
還是進行運算子過載後的''==''既能夠完成物件之間的相等判斷,又能夠「顯然」的了解其功能作用。
成員函式的''==''的運算子過載實現:
當將其寫為成員函式時,所對應的函式引數會少乙個。還記得this指標嗎?成員函式內部的第乙個引數均為this指標,其指向當前呼叫該函式物件的位址。
class date
date(const date& d)
bool operator==(date& d1)
private:
int _year;
int _month;
int _day;
};int main()
這是定義為成員函式的寫法。在函式內部this指標進行的解引用不非要顯式寫出,在後的函式呼叫有直接寫法、編譯器執行時兩種寫法,均能夠正常呼叫,只不過直接寫法更適合我們直觀理解,而實際上編譯器是用後者進行呼叫處理的。
兩者的區別:
1)全域性函式運算子需要幾個引數就得輸入幾個引數。
2)成員函式運算子個數時所需引數再減1,其中第乙個引數被this指標所代替。
C 系列 21 運算子過載
賦值運算子過載即便不寫,編譯器也會預設自動生成,完成正常賦值。class date date const date d private int year int month int day int main class date date const date d void operator con...
C 運算子過載 過載特殊運算子
賦值運算子用於同類物件間的相互賦值。賦值運算子只能被過載為類的非靜態成員函式,不能過載為友元函式和普通函式。對於使用者自定義的類而言,如果沒有過載賦值運算子,那麼c 編譯器會為該類提供乙個預設的過載賦值運算子成員函式。預設賦值運算子的工作方式是按位對拷,將等到右邊物件的非靜態成員拷貝給等號左邊的物件...
C 運算子過載賦值運算子
自定義類的賦值運算子過載函式的作用與內建賦值運算子的作用類似,但是要要注意的是,它與拷貝建構函式與析構函式一樣,要注意深拷貝淺拷貝的問題,在沒有深拷貝淺拷貝的情況下,如果沒有指定預設的賦值運算子過載函式,那麼系統將會自動提供乙個賦值運算子過載函式。賦值運算子過載函式的定義與其它運算子過載函式的定義是...