c++為了增強**的可讀性引入了運算子過載,運算子過載是具有特殊函式名的函式,也具有其返回值型別,函式名字以及引數列表,其返回值型別與引數列表與普通的函式類似。
函式名字為:關鍵字operator後面接需要過載的運算子符號。
函式原型:返回值型別operator操作符(引數列表)
注意:1.不能通過連線其他符號來建立新的操作符:比如operator@
2.過載操作符必須有乙個類型別或者列舉型別的運算元
3.用於內建型別的操作符,其含義不能改變,例如:內建型別+,不能改變其含義
4.作為類成員的過載函式時,其形參看起來比運算元數目少1成員函式的操作符有乙個預設的形參this,限定為第乙個形參
5…*,::,sizeof,?:,.注意以上5個運算子不能過載。
//全域性的operator==
class
date
//private:
int _year;
int _month;
int _day;};
//這裡會發現運算子過載成全域性的就需要成員變數是共有的,那麼問題來了,封裝如何保證?
//這裡可以用友元解決,或者乾脆過載成成員函式。
bool
operator==(
const date& d1,
const date& d2)
void
test()
class
date
// bool operator == (date* this, const date& d2)
// 這裡需要注意的是,左運算元是this指向的呼叫函式的物件
bool
operator
==(cosnt date& d2)
private
:int _year;
int _month;
int _day;};
void
test()
//全域性的operator==
class
date
date
(const date& d)
date&
operator
(const date& d)
}private
:int _year;
int _month;
int _day;
};
賦值運算子主要有四點:
1.引數型別
2.返回值
3.檢測是否自己給自己賦值
4.返回*this
5.乙個類如果沒有顯式定義賦值運算子過載,編譯器也會生成乙個,完成物件按照位元組序的值拷貝。
class
date
private
:int _year;
int _month;
int _day;};
intmain()
那麼**編譯器生成的預設賦值過載函式已經可以完成位元組序的值拷貝了,**我們還需要自己實現嗎?當然像日期類這樣的類是沒必要的。那麼下面的類呢?驗證一下試試
//這裡會發現下面的程式會崩潰掉,這裡需要用深拷貝去解決。
class
string
~string()
private
:char
* _str;};
intmain()
運算子過載 賦值運算子的過載
有時候希望賦值運算子兩邊的型別可以不匹配,比如,把乙個int型別變數賦值給乙個complex物件,或把乙個 char 型別的字串賦值給乙個字串物件,此時就需要過載賦值運算子 注意 賦值運算子 只能過載為成員函式 賦值運算子過載例項示例 include include using namespace ...
過載賦值運算子
1 注意過載賦值運算子和,運算子必須定義為類的成員函式。2 注意 如果程式不提供顯示的賦值運算子則系統會提供乙個預設的賦值運算子。3 什麼時候過載賦值運算子 當類中含有指標成員時,一般都要重定義類的賦值運算子。4 過載賦值運算子時應有處理語句m m的情況。其中m是某乙個類的物件。如果不處理這樣的語句...
賦值運算子過載
在下面類中實現 class cmystring 為了寫出乙個完整的賦值運算子過載函式,我們要考慮以下幾個問題 一步步解決上述的問題,我們可以編寫出經典的演算法 cmystring cmystring operator const cmystring str return this 考慮到異常安全性的...