C 第5次課程筆記

2021-08-28 23:18:31 字數 2271 閱讀 5674

複製建構函式

複製構造,用乙個已有的物件來建立乙個新物件,用已有物件的資料來對新物件的資料進行初始化。

a a1;

a a2(a1);

複製建構函式 就是在通過複製構造來建立新的物件的時候,會被自動呼叫的函式。

複製建構函式的呼叫場景

在哪些情況下會自動呼叫複製建構函式?

1 明確的指出用複製構造的方式來建立新的物件。

a a1;

a a2(a1);

a a3 = a1;

a a3;

a3 = a1;

c++支援物件的賦值。物件的賦值預設情況下完成的是完全複製。

2 當函式的形式引數是物件,進行函式呼叫的時候,會用實參來複製形參,也會呼叫複製建構函式(拷貝建構函式)。

void f( a a)

int main()

所以,當傳遞物件的時候,推薦使用引用作為函式的引數,減少系統開銷。

3 當函式的返回值是物件的時候,會用該返回的物件通過複製構造的方式去建立乙個臨時物件。在dev c++中實驗顯示沒有呼叫,原因可能是編譯器對**進行了優化。

a g()

int main()

//4_2.cpp

#include

using namespace std;

class point

point(point &p); //拷貝建構函式

int getx()

int gety()

private: //私有資料

int x, y;

};//成員函式的實現

point::point(point &p)

//形參為point類物件的函式

void fun1(point p)

//返回值為point類物件的函式

point fun2()

//主程式

int main()

建構函式和型別轉換之間的關係(補充)

型別轉換:將一種型別轉換為其他型別。

有兩類轉換形式

顯式轉換

int i = 6;

double d;

d = double(i);

d = (double) i;

隱式型別轉換

d = i;

在賦值、或者引數傳遞過程中,如果兩者之間的型別是可以轉換的,則自動進行型別轉換。

point(1,2); 直接建立乙個臨時物件。

p1 = point(1);

從物件導向的角度看,是建立乙個臨時的物件。

從型別轉換的角度看,將整形轉換成了point型別。

可以將右邊的類的型別轉換為左邊的類的型別的條件

1 型別之間是相容的 int double

2 如果左邊的類的建構函式支援用右邊的型別的乙個變數作為引數進行呼叫。本質是要利用建構函式建立乙個臨時物件,從最終的效果來看,相當於型別轉換。

有的時候,這個性質在發生隱式型別轉換的時候會讓**不直觀。p1 = 1;

explicit point(int x1,int y1=0)

防止通過建構函式進行隱式型別轉換,提高程式的可讀性。

#include

using namespace std;

class point

private:

int x,y;

};int main()

類的組合(*)

乙個大的類裡面會包含其他小的類的物件作為它的成員,模擬了用小的東西組成大的東西這樣乙個現實世界經常發生的現象。

組合類:指大的類(整體)。

內嵌物件:在組合類裡面定義的其他類的物件。(區域性,小的部件)

內嵌類:內嵌物件所對應的類。

在類組合的時候要解決的關鍵問題?

如何對內嵌物件的資料進行初始化?

有個特殊的規定:當建立組合類的物件的時候,會先呼叫內嵌物件的建構函式對內嵌物件進行初始化。

如何呼叫內嵌物件的建構函式呢?

通過初始化列表來完成,初始化列表中也可以對普通成員進行初始化

line(int x1,int y1,int x2,int y2):p1(x1,y1),p2(x2,y2), len(0)

如果初始化列表中沒有寫建立物件的語句,則編譯器自動呼叫內嵌物件的無參的建構函式來建立內嵌物件。

組合類的情況下建構函式的呼叫順序:

先建立內嵌物件,再執行組合類建構函式裡面的**。

析構函式的呼叫順序和建構函式相反。

如何寫組合類的複製建構函式?

line(line & l):p1(l.p1),p2(l.p2)

c 第5次實驗

一 問題及 檔名稱 多繼承 作 者 姜小萌 完成日期 2016 年 5 月 6 日 版 本 號 vc6.0 輸入描述 問題描述 程式輸出 問題分析 略 演算法設計 略 include include using namespace std class person void setname stri...

C 第5次作業

檔名稱 balabala 作 者 郝榮雅 完成日期 2016 年 5 月 17 日 版 本 號 v1.0 對任務及求解方法的描述部分 輸入描述 問題描述 程式輸出 問題分析 演算法設計 1.include include using namespace std class person void s...

C 第5次實驗

檔名稱 ex1 1.cpp 作 者 張偉鍵 完成日期 2017 年 5 月 19 日 版 本 號 v1.0 對任務及求解方法的描述部分 分陣列 輸入描述 無 問題描述 從鍵盤中輸入10個數放在陣列a中,將該陣列中奇數放到陣列b,偶數放到陣列c中後分別輸出。程式輸出 奇與偶數組 問題分析 略 演算法設...