day6知識點:
1. 在運算子過載時盡量遵循原有預設的規則,如以下**
int a , b , c;
(a + b) = c; //是錯誤的
而在運算子過載中:
complex complex::operator+(complex& another)
complex c1(1,2) ,c2(2,3);
(c1 + c2) = c; //是正確的,但不遵循預設語法規則
2. c++不允許使用者自定義新的運算子,只能對已有的c++運算子進行過載
c++允許過載的運算子:
c++不允許過載的運算子只有四個:
3. 對於雙目運算子
過載為成員(即成員函式)的話,需要乙個引數,過載為友元(即全域性函式)的時候需要兩個引數
const complex operator+(complex& another);
friend complex operator+(complex& a,complex& b);
對於單目運算子
過載為成員的話,不需要引數,過載為友元時需要乙個引數。
三目運算子無法過載。
4.若函式過載為
void complex::operator+=(const complex &another)
x +=y; //可行
x += y += z; //不可行,不能用做右值,所以應有返回值
若函式過載為
complex complex::operator+=(const complex &another)
x +=y; //可行
x += y += z; //可行
(x += y) += z;// 不可行,不能用作左值,所以應返回引用
最終確認版本為:
complex& complex::operator+=(const complex &another)
逐步迭代,盡量使語法規則接近自然語言。
例1.+操作符過載
#include using namespace std;
class complex
void dis()
void dis()
int main()
則:
complex c(1,1);
complex t = -c; //可行,符合常用規則
complex t = -(-c); //可行,符合常用規則
complex m(2,2);
-c = m; //可行,不符合常用規則
若將過載函式改為
const complex operator-()
-c = m; //不能通過
t = -(-c); //也不能通過
因為-c呼叫時返回的const complex,但是const類物件只能呼叫const成員函式
所以應改為:
const complex operator-()const
-c = m; //不能通過
t = -(-c); //能通過
例3.單目操作符-(負號)過載
#include using namespace std;
class complex
void dis()
private:
float _x;
float _y;
};int main()
如若把流輸入運算子在mystring中過載,考慮到不能確定_str容量的大小,應該這樣定義流輸入運算子
istream& operator>>(iostream &is,mystring &s)
例4.雙目操作符《與》的過載
#include using namespace std;
class complex
void dis()
private:
float _x;
float _y;
};int main()
sender operator <
private:
string _addr;
};class mail
friend sender sender:: operator <
private:
string _title;
string _content;
};sender sender::operator <
};
point2d p2(1,2);
point3d p3(3,4,5);
p3 = p2; //轉換建構函式賦值,先把隱式p2公升級為3d型別,然後發生的是一種賦值,利用建構函式實現
convert(p2); //轉換建構函式傳參
8.explicit關鍵字
若在轉換建構函式前加上explict關鍵字,則在轉換過程中不能隱式轉換,只能顯示轉換
p3 = (point3d)p2;
convert((point3d)p2);
9.型別轉化操作符函式
作用:把自身型別隱式或顯式轉換為其他型別,轉換函式無引數無返回
class point3d
};
point2d p2(p3);
10.函式運算子()的過載
仿函式,就是使乙個類使用看上去像乙個函式
class pow
int operator ()(int i)
};int main()
11.堆記憶體操作符的過載(new delete)
格式如下
重點:可以在new中實現自我的早期定製而不用使用建構函式,詳細內容見例6。
例6. 堆記憶體運算子的過載
#include #include using namespace std;
class a
void operator delete(void *p)
12.智慧型指標的過載
智慧型指標:
auto_ptrptr(new a); //auto_ptr 類模板 auto_ptr模板類
要實現智慧型指標的過載,建立乙個類,利用類物件成員退出棧空間的析構函式來實現自動delete
#include #include #include using namespace std;
class a
a& operator*()
a *ptr;
};void foo()
int main()
13.++的過載
前置++的過載
在預設++的運算中有以下計算規則
int main()
後置++的過載
計算規則
int main()
{ int a = 100; //能通過
int b = a++; //能通過
a++++; //無法通過
cout由於a++++無法通過,所以返回值型別為const型,因為const型別無法呼叫非const函式
在選擇返回型別是否為引用時,原則是能使用引用盡量使用引用。
為了區分前++和後++,在後++的過載函式呼叫引數中加 int ,如果為全域性的,函式呼叫引數為(complex &,int)
Linux學習之路 day 6
一 時間日期類指令 1.find 從指定目錄向下遞迴地遍歷其各個子目錄,將滿足條件的檔案或目錄顯示在終端。語法 find 搜尋範圍 選項 2.locate 利用事先建立的locate資料庫 包含所有檔名稱及路徑 實現快速定位給定的檔案。無需遍歷整個檔案系統,查詢速度快,但需要定期更新locate時刻...
Python學習之路 Day6
python 在執行過程中,遵循下面的基本原則 1 普通語句,直接執行 2 碰到函式,將函式體載入記憶體,並不直接執行 3 碰到類,執行類內部的普通語句,但是類的方法只載入,不執行 4 碰到if for等控制語句,按相應控制流程執行 5 碰到 break,continue等,按規定語法執行 6 碰到...
C 學習筆記day6 結構體
1 結構體定義 include include using namespace std 1 建立學生資料型別 學生包括 姓名,年齡,分數 struct student s3 順便建立結構體變數 2 通過學生型別建立具體學生 intmain cout 姓名 s2.name 年齡 s2.age 分數 s...