C 中建構函式的手動和自動呼叫方式

2022-08-18 10:33:16 字數 3124 閱讀 4821

1,物件的構造通過建構函式來完成,和類名相同且沒有返回值,這個時候只有參   數乙個特性,建構函式可以自定義引數,這個引數一般而言就是對類進行初始  化來使用的;帶有引數的建構函式的意義在於可以使得每個物件有不同的初始   化狀態(生活中每個事物必然包含自己的初始化狀態,不如人的出生,面向對   象用來將生活中的事物對映的程式設計領域,所以現實世界的情況都必須可以  用物件導向的語言來描述,因此帶有引數的建構函式就是非常必要的);

2,帶有引數的建構函式:

1,建構函式可以根據需要定義引數;

2,乙個類中可以存在多個過載的建構函式;

3,建構函式的過載遵循 c++ 過載的規則;

4,**示例:

1

class

test28

};

3,物件定義和物件宣告的區別:

1,物件定義:申請物件的空間並呼叫建構函式;

1,第一步,必須申請物件所占用的記憶體空間;

2,第二步,呼叫建構函式;

2,物件宣告:告訴編譯器存在這樣乙個物件;

1,物件在**定義的不知道,鏈結的時候回去找;

2,預處理,編譯器對源**進行檢查並生成目標檔案,鏈結器在各個目標檔案中尋找目標檔案存在的一些名字;

3,物件宣告時,沒有物件定義時的兩個步驟;

3,**示例:

1 test t;  //

定義物件並呼叫建構函式;23

int main()

4

4,物件的宣告中可以在構造函式引數中給出預設值,物件的定義中不能夠在構 造函式引數中給出預設值;

4,建構函式的自動呼叫(第一種初始化物件方式):

1 #include 2

3class

test410

11 test(int

v) 12

15};

1617

intmain()

18

1,實驗結果說明:

1,初始化和賦值看上去相同之處在於當初始化用賦值符號表達的時候;

2,不同之處在於初始化要呼叫建構函式,而賦值不會;

5,建構函式的呼叫:

1,一般情況下,建構函式在物件定義時被自動呼叫;

2,一些特殊情況下,需要手工呼叫建構函式:

1,如何建立物件陣列;

6,建構函式的手工呼叫(第二種初始化物件方式)程式設計實驗:

1 #include 2

3class

test

414 test(int

v) 15

20int

getvalue()

2124

};25

26int

main()

2734

35 test ta[3] = ; //

手動呼叫建構函式;

3637

for(int i=0; i<3; i++) //

迴圈結果為 0 1 2;分別呼叫了相應的建構函式;

3841

42 test t = test(100); //

初始化第二種方式,手工呼叫建構函式;

4344 printf("

t.getvalue() = %d\n

", t.getvalue());

4546

return0;

47 }

7,小例項:

1,需求:開發乙個陣列類解決原生陣列的安全性問題:

1,提供函式獲取陣列長度;

1,c++ 要相容 c 語言中的陣列,但是 c 語言中的陣列沒有長度資訊,用著用著就越界了;

2,提供函式獲取陣列元素;

3,提供函式設定陣列元素;

8,陣列類的實現程式設計實驗:

1,intarray.h 檔案:

1

#ifndef _intarray_h_

2#define _intarray_h_34

class

intarray5;

1617

#endif

2,intarray.cpp 檔案:

1 #include "

intarray.h"2

3 intarray::intarray(int len) //

不加作用域分辨符時,是全域性函式(此時僅名字字首相同而已),所以要加作用域分辨符指明是陣列類中的函式;411

12 m_length =len;13}

1415

intintarray::length()

1619

20bool intarray::get(int index, int&value)

2128

29return ret; //

越界則返回 false;30}

3132

bool intarray::set(int index, int

value)

3340

41return

ret;42}

4344

void intarray::free

()45

3,intarray 的使用:

1 #include 2 #include "

intarray.h"3

4int

main()512

13for(int i=0; i)

1421}22

23 a.free

();24

25return0;

26 }

4,這裡展示了物件導向的強大,我們可以通過類來封裝一些之前學習到的概念,並且可以將這些概念上的缺陷通過封裝來彌補開來;

9,小結:

1,建構函式可以根據需要定義引數;

2,建構函式之間可以存在過載關係;

3,建構函式遵循 c++ 中過載函式的規則;

4,物件定義時會觸發建構函式的呼叫;

1,構造函式呼叫方式分為自動呼叫和手工呼叫兩種;

2,自動呼叫的形式又分為引數式和賦值式;

3,即初始化時,分為兩種呼叫方式三種書寫形式;

5,在一些情況下可以手動呼叫建構函式;

C 中構造函式呼叫建構函式

include include using namespace std struct cls cls int main 列印結果是不定的,不一定為0 奇怪的地方在於建構函式中呼叫了自己的另乙個建構函式 我們知道,當定義乙個物件時,會按順序做2件事情 1 分配好記憶體 非靜態資料成員是未初始化的 2 ...

C 中構造函式呼叫建構函式

include stdlib.h include iostream using namespace std struct clscls int main 列印結果是不定的,不一定為0 奇怪的地方在於建構函式中呼叫了自己的另乙個建構函式 我們知道,當定義乙個物件時,會按順序做2件事情 1 分配好記憶體...

c 中構造函式呼叫建構函式

c 中建構函式完成的工作分兩步 1 分配空間 2 初始化空間 構造函式呼叫建構函式。class a a int a private int a 這樣會導致,a 中先分配了空間,然後呼叫a 0 又建立了乙個臨時物件,然後初始化為0,而原物件則沒有初始化。這種問題在類中有指標需要分配空間時會導致災難。從...