20201028 C 建構函式

2021-10-25 08:12:28 字數 2898 閱讀 4282

一、建構函式

1.為什麼引入建構函式

2.所謂建構函式就是和類名相同的函式,可以帶引數也可不帶引數,也可以帶有不同的引數。

3.在構造類物件的時候,根據傳進來的引數來判斷是呼叫哪乙個建構函式。

4.如果乙個沒有引數的建構函式,那麼在構造類物件的時候不要寫圓括號(因為學了圓括號不是構造物件,而是宣告)。

5.在建構函式的引數裡有這樣乙個引數 char* work="none" ,在不給這個引數傳入時,預設就是none。 

6.例項化物件的方法:  

person per("zhangsan", 16);

person per2;   /* 呼叫無參建構函式 */

person per3(); /* int fun();   這只是乙個宣告不是乙個呼叫*/ 

/*********用指標來例項化物件*****/

person *per4 = new person;

person *per5 = new person(); //per4和per5完全相同

person *per6 = new person[2];  //例項化了兩個物件

person *per7 = new person("lisi", 18, "student");

person *per8 = new person("wangwu", 18); 

// 因為最後乙個引數是work,在定義時賦值了「none」,所以不賦值時預設時「none」

/*********不同的物件呼叫成員函式*****/

per.printinfo();

per7->printinfo();

per8->printinfo();

7.動態建立的物件要如果釋放?程式執行完畢之後會自動釋放,用delete命令可以手工釋放

delete per4;

delete per5;

delete per6; //因為person6是乙個陣列

delete per7;

delete per8;

8.在建構函式裡可以開闢一塊空間來儲存變數的值:

person(char *name)
9.在主函式(main函式)沒有執行完時,用new分配的記憶體不會被釋放掉,在整個主函式全部執行完畢才會將new分配的記憶體全部釋放。有兩種方法來釋放:1.寫乙個free函式 呼叫delete來乙個個把new出來記憶體都釋放掉 2.使用析構函式

10.析構函式的使用:

在函式名之前加上乙個波浪號~,表示這是乙個析構函式。析構函式可以防止記憶體洩漏

~person()
11.很多建構函式只有乙個析構函式,並且析構函式沒有引數

12.析構函式在例項化物件在銷毀瞬間被呼叫 

13.用new建立的例項化物件,如果不手動釋放,在主函式執行完畢之後也會被釋放,但是並不是使用析構函式釋放的。如果手動釋放new建立的例項化物件時就會呼叫析構函式。(如果有析構函式的話)

14.不是使用new建立的例項化物件,手動或者系統自動釋放都是呼叫的析構函式。(如果有析構函式的話)

15.建議如果用new例項化物件的話,用delete手動釋放

16.如果沒有在類裡定義預設建構函式和析構函式的話,系統會預設給我們加上建構函式和析構函式,並且這兩個函式都為空。

17.c++裡還會提供預設拷貝建構函式

這段程式裡,per2和per的內容是相同的,即使我們沒有定義引數是類的建構函式,也就是系統自動給我們提供了預設的拷貝建構函式,這段程式的含義是把per內的內容全部拷貝給per2

person per("zhangsan", 18);

person per2(per);

per2.printinfo()

18.預設拷貝建構函式是值拷貝,會存在的隱患是:如果將per的記憶體釋放後,在釋放per2時,會釋放per的記憶體,也就是同一塊記憶體可能會被釋放兩次。兩個物件的*name和*work都指向同一塊記憶體。為了避免這種問題我們需要自己寫自己的建構函式:

person(person &per) 

用new來重新分配空間,在進行物件拷貝時,新的物件指標變數會指向新的記憶體。

19.建構函式的構造順序:

首先是全域性變數,main函式,然後根據執行順序碰到哪個例項化物件就呼叫哪乙個建構函式。

按執行中定義物件的順序呼叫建構函式,靜態物件只呼叫一次建構函式;全域性物件在main函式執行前被構造

20.子函式中靜態的例項化物件在子函式執行結束後也不會呼叫析構函式來銷毀,當再次呼叫子函式時,遇到靜態的例項化物件就不會再次建立了。

21.如果類裡面有個物件的話是如何初始化的?

類裡面有物件成員的話,按照寫的順序來呼叫建構函式。

22.如果定義了有引數的建構函式,必須提供乙個無引數的建構函式,如果不提供就會編譯出錯。因為如果自己定義了有引數的建構函式,那麼系統不會在提供預設的無引數的建構函式。

23.這些例項化物件的析構函式被呼叫的順序和被構造的順序相反,先構造的後析構。

24.在類內例項化物件時用引數初始化值

class student {

private:

person father;

person mother;

int student_id;

public:

student()

{ cout<<"student()"《在student類裡,在例項化father和mother時,用的student建構函式的引數初始化物件father和mother裡的資料成員

/************例項化物件的順序和寫資料成員的順序一致*******************/

20201028 C 靜態成員 友員

一 靜態成員 1.如果想獲得一共例項化了多少個物件,這個計算一共例項化了多少個物件的變數不應該屬於某乙個物件,應該屬於這個類,所以我們把這個變數設定為靜態的。2.如果把變數設定為靜態的,則這個變數不屬於任何的物件,而是屬於整個類的。這個靜態變數不是例項化多少個物件就有多少個,而是只有乙個。3.讓乙個...

C 建構函式 拷貝建構函式

建構函式 class base private int m var 建構函式無返回值型別,函式名和型別相同。拷貝建構函式傳遞引數為引用。1 class base2 7 拷貝建構函式 8 base base ref m var ref m var 9 11 private 12 intm var 13...

C 構造器(建構函式)

定義和作用 構造器是在構建類的 引用時 自動執行的方法。所以,每個類都必須至少要有乙個構造器。在訪問乙個類的時候,編譯器最先執行構造器中的 它與類同名,帶引數的構造器能夠獲取引數,但是與方法不同的是 構造器雖然也是一種 例項型別 即必須通過例項來進行呼叫,也可以稱之為引用型別 但是卻不能返回任何值 ...