C 學習之路 day6

2021-08-07 09:53:47 字數 4538 閱讀 4996

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...