運算子過載:對已有的運算子重新進行定義,賦予另一種功能,以適應不同的資料型別
加號運算子過載:實現兩個自定義資料型別相加的運算
可以通過成員函式過載+號
關鍵字 operator+
person operator+ (person &p);
完成函式後
person p1;
person p2;
不必寫p1.operator+(p2);
只需要 p1+p2;
也可以通過全域性函式過載+號
使用的時候也只需要p1+p2
運算子過載也可以發生函式過載
即給+賦予更多的對於不同引數的功能
內建的資料型別表示式運算子不能改變; 不要濫用運算子過載
左移運算子過載:可以輸出自定義資料型別
person p;
cout不會利用成員函式過載《運算子,因為無法實現cout在左側,本質是cout operator用全域性函式過載左移運算子
ostream cout標準輸出流物件,這個物件全域性只能有乙個,不能拷貝,所以需要用引用的方式
void operator<
cout上述**只能呼叫cout
cout
可以呼叫cout過載左移運算子配合友元可以實現輸出自定義型別
遞增運算子過載:通過過載遞增運算子,實現自己的整型資料
成員函式,類中定義了私有成員變數a;
前置person& operator++()返回引用是為了一直對乙個資料進行遞增
a++;
return *this;
先做++運算,再做自身返回
後置person operator++(int)//int為佔位引數,用於區分前置和後置遞增
不能返回引用因為此時返回的是區域性變數
先記錄在遞增
person temp=*this;
a++;
return temp;
前置遞增返回引用,後置遞增返回值
賦值運算子過載
c++編譯器至少給乙個類新增四個函式
1預設建構函式
2預設析構函式,均無參函式體為空
3預設拷貝建構函式,對屬性進行值拷貝
4賦值運算子 operator=,對屬性進行值拷貝
如果類中有屬性指向堆區,做賦值操作時也會出現深淺拷貝問題
如果不寫特別的賦值,存在堆區資料時,普通賦值會進行淺拷貝,析構堆區就會造成重複釋放
成員函式完成過載:
person& operator=(person &p)
{此時的a為指標,指向一塊堆區資料int *a=new int (10);
編譯器提供的如:a=p.a;
要寫的為:
先判斷是否有屬性在堆區,如果有先釋放乾淨,然後再進行深拷貝
if(a!=null)
delete a;
a=null;
a=new int(*p.a);深拷貝
return *this;保證返回值,完成鏈式操作
為了滿足鏈式操作,需要進行更改
關係運算子過載
過載關係運算子,可以讓兩個自定義型別物件進行對比操作
成員函式過載
bool operator==(person &p)
if(this->name==p.name&&this->age==p.age)return ture;
return false;
函式呼叫運算子()也可以過載
由於過載後使用的方式非常像函式的呼叫,因此成為仿函式
仿函式沒有固定寫法,非常靈活
成員函式實現
void operator()(string test)
cout << test 使用的時候
void test()
person p;
p("hello world");將會輸出hello world 仿函式
呼叫正常函式,test2(「hello world」);非常相似
匿名函式物件,完成後立即被釋放,空的小括號就代表他
person()(「hello world」);
運算子過載之過載型別運算子
普通型別 類型別 呼叫對應的只有乙個引數 引數的型別就是這個普通型別 的建構函式 需求 boy boy1 10000 薪資 建構函式boy int boy boy2 rock 姓名 建構函式boy char 普通型別賦值給類型別其實很簡單,就是專門的對這個賦值的型別定義乙個建構函式。編譯器在執行 的...
運算子過載 賦值運算子的過載
有時候希望賦值運算子兩邊的型別可以不匹配,比如,把乙個int型別變數賦值給乙個complex物件,或把乙個 char 型別的字串賦值給乙個字串物件,此時就需要過載賦值運算子 注意 賦值運算子 只能過載為成員函式 賦值運算子過載例項示例 include include using namespace ...
運算子過載
c 中的運算子 1。大多數系統預定義運算子都能過載 不值得過載 不能被過載 2過載不能改變優先順序 不能改變結合性 不能改變運算子所需運算元的個數 過載後,可按這些運算子的表達方式使用 運算子過載的語法 一 通過運算子過載函式進行過載 1。運算子過載函式是成員函式 語法形式 type x opera...