第十一講 過載

2021-08-11 04:19:38 字數 3979 閱讀 9731

過載單目運算子

單目運算子只有乙個運算元(如 !a, -b, ++i, - -j 等),因此過載函式只有乙個引數,如果過載函式為成員函式,還可以省約此引數。

例:將「-」過載成友元函式。

單目運算子一般過載為成員函式

#include 

class

complex

; void show()

;complex

operator-(complex &com)

void main()

例4.5: 「++」過載成員函式。

對 time類,模擬秒錶,滿60秒進一分鐘,秒又從0開始計。輸出分、秒。

#include // 「++」過載

class time

time(int m,int s):minute(m),sec(s){}

time operator++(); // 過載++運算子

void display();

time time::operator++()

return *this; // 返回當前物件值

} int main()

return

0; }

例4.6: 在4.5基礎上增加後置自增運算子  「++」過載。
#include 

class time

time(int m,int s):minute(m),sec(s){}

time operator++(); //宣告前置自增++過載函式

time operator++(int); //宣告後置自增++過載

void display()

;區別:前置++ 是先自加,返回是修改後的物件本身。

後置++ 是,返回是自加前物件,然後自加。

注意:後置++ 的int引數只是與前置++函式有所區別,沒有任何作用。

time time::operator++()

return *this;}

time time::operator++(int)

return temp;}

int main()

2、 過載流插入和流提取運算子

c++的流插入運算子「<<」和流提取運算子「>>」是在類庫中提供的。

cin是istream類的物件,cout是ostream 類的物件。

在類庫提供的標頭檔案中已經對「<<」和「>>」進行了過載(整型、實型等的輸入和輸出)。

凡是用 cout<< 和 cin>> 進行輸入輸出的,都要將:

#include

#include 

class

complex

;ostream& operator

<< (ostream& output, complex& c)

istream& operator >> (istream& input, complex& c)

void main( )

說明:作用是將double 型引數 r 轉換成 complex 類的物件,將 r 作為複數的實部,虛部為0。

例如:已有轉換建構函式:

complex (double r)

則:complex c1(3.6);

// 建立c1物件,由於只有乙個引數,呼叫轉換建構函式

complex (13.6 );

// 建立無名物件,合法,但無法使用,此為型別轉換

c1 = complex (13.6);

//合法,利用型別轉換建構函式建立物件,並賦值給c1

#include

class

complex

// 普通建構函式

complex(double r) // 轉換建構函式

void show()

利用轉換建構函式將指定資料型別轉換成類物件的步驟如下:
①、宣告乙個類( 如complex );

②、在該類中定義乙個轉換建構函式(只有乙個 引數),引數型別是待轉換的型別。

③、以下形式進行型別轉換:

類名(待轉換型別的資料);

注意:轉換建構函式只能有1個引數,若有多個引數則 不是轉換建構函式。(多個引數轉換哪個?)

c、型別轉換函式—-類成員函式

型別轉換函式的作用:將乙個類的物件轉換成另一型別的資料。省去了對不同的運算子一一過載的麻煩。

型別轉換函式的格式:

operator 型別名( ) //將本類物件轉換為指定型別

例如:已經宣告了乙個complex類,可在類中定義型別轉換函式:

operator double( ) // double型別過載後除了原有含義,也有

// 將complex物件轉換成double型別的含義

注意:

1)型別轉換函式使用operator關鍵字,因此也稱為「型別轉換運算子過載函式」。

2)型別轉換函式只能是類成員函式,因為轉換的主體是本類物件,不能作為友員函式或普通函式。

例4.9:型別轉換函式的應用

#include 

using

namespace

std;

class complex //類定義

complex(double r,double i)

operator

double()

//型別轉換函式

private:

double real, imag;

};int main()

3、不同型別資料間的轉換

轉換建構函式和型別轉換函式有乙個共同的特點:在需要的時候,系統會自動呼叫這些函式。

例如:若已定義double變數到 d1、d2,complex物件 c1,c2。且類中已定義了型別轉換函式,設程式有以下表示式:

d1 = d2 + c1

編譯系統發現「+」左側的d2是double型,右側c1是 complex物件,如果沒有對「+」過載,就會檢測有無型別轉換函式,結果發現對double的過載函式,就呼叫該函式,將complex物件c1轉換成double型資料,建立了乙個臨時的double型變數,並與d2相加,最後將double 型和數賦給變數d1。

例4.10 運算子過載、轉換建構函式的綜合應用

#include 

class

complex

complex (double r)//轉換建構函式

complex (double r, double i)

friend

complex

operator +

(complex c1,complex c2);

operator

double()

// 此時 型別轉換函式會產生二義性.

void display( );

private:

double real, image;

};void

complex::display( )

void main( )

3、 不同型別資料間的轉換

程式分析:

1)如果沒有定義轉換建構函式,程式出錯,因為即使過載運算子,也不能讓complex物件與double資料相加。

2)定義了轉換建構函式,也過載了「+」運算子,在處理c1+2.5時,編譯系統解釋為operator +(c1, 2.5),由於2.5不是complex 物件,系統先呼叫轉換建構函式 complex(2.5),建立乙個臨時物件,其值為( 2.5 +0i )。表示式成為:

operator + (c1,complex(2.5))

// 兩物件相加,結果賦給c3。

第十一講 資料清洗

資料採集完,要進行資料清洗工作,整個資料分析過程中,資料清洗工作幾乎要佔到80 的時間。資料清洗規則總結為四個關鍵點 完全合一 1 完整性 單條資料是否存在空值,統計的字段是否完善。2 全面性 觀察某一列的全部數值,比如平均值 最大值 最小值,根據常識判斷是否有問題。如 資料定義 單位標識 數值本身...

第十一講 if分支語句

1 if單分支 語法結構 if 條件 code.code.注 1,條件是表示式,不需要用括號括起來 2,條件的結束要有冒號 3,語句塊沒有花括號,而是由統一的縮進來實現 eg1 count 89 if count 80 條件是表示式,不需要用括號括起來 print larger then 80 eg...

第十一講 外觀模式

facade模式也叫外觀模式,是由gof提出的23中設計模式中的一種。facade模式為一組具有類似功能的類群,比如類庫,子系統等等,提供乙個一致的簡單的介面。這個一致的簡單的介面被稱作facade。a子系統 public class systema package test.com.facade ...