17 物件的構造(上)

2021-10-03 00:13:03 字數 2408 閱讀 1139

注:部落格中內容主要來自《狄泰軟體學院》,部落格僅當私人筆記使用。

測試環境:ubuntu 10.10

gcc版本:4.4.5

一、問題

物件中成員變數和初始值是多少?

二、小實驗

1)下面的類定義中成員變數i和j的初始值是什麼?

class test

int getj() ;

}

程式設計實驗

成員變數的初始化

17-1.cpp

#include class test

; int getj() ;

};test gt;

int main()

操作:

1)g++ 17-1.cpp -o 17-1.out編譯正常,列印結果:

gt.i = 0;

gt.j = 0;

gt.i = 0;

gt.j = 0;

pt->i = 0;

pt->j = 0;

2)修改gt物件為區域性變數:

#include class test

; int getj() ;

};int main()

列印結果:

gt.i = 0;

gt.j = 0;

t1.i = 134514251

t1.j = -1218482176

pt->i = 0

pt->j = 0

分析:

在棧上分配記憶體,私有成員變數資料為隨機值;靜態物件或者全域性物件,私有成員變數資料為0。靜態物件或者全域性物件儲存在bss段,該段記憶體使用前會被清零。

三、物件的初始化

1)從程式的角度,物件只是變數,因此:

- 在棧上建立物件時,成員變數初始為隨機值

- 在堆上建立物件時,成員變數初始為隨機值

- 在靜態儲存區建立物件時,成員變數初始為0(被分配到bss段)

靜態儲存區:全域性變數和static修飾的變數在靜態儲存區

2)生活中的物件都是在初始化後上市的

3)初始狀態(出廠設定)是物件普遍存在的乙個狀態

問題:程式中如何對乙個物件進行初始化?

4)一般而言

,物件都需要乙個確定的初始狀態

5)解決方案

- 在類中提供乙個pubilc的initialize函式

- 物件建立後立即呼叫initialize函式進行初始化

程式設計實驗

初始化函式

17-2.cpp

#include class test

int getj()

void initialize()

};test gt;

int main()

操作:

1)g++ 17-2.cpp -o 17-2.out編譯正常,列印結果:

gt.i = 1

gt.j = 2

t1.i = 1

t1.j = 2

pt->i = 1

pt->j = 2

6)存在的問題

- initialize只是乙個普通函式,必須顯示呼叫

- 如果未呼叫initialize函式,執行結果是不確定的

四、建構函式

1)c++中可以定義與類名相同的特殊成員函式

- 這種特殊的成員函式叫做建構函式

* 建構函式沒有任何返回型別的宣告

* 建構函式在物件定義時自動被呼叫(執行機制)

程式設計實驗

建構函式初探

17-3.cpp

#include class test

int getj()

test()

};test gt;

int main()

操作:

1)g++ 17-3.cpp -o 17-3.out編譯正常,列印結果:

test() begin

test() end

gt.i = 1

gt.j = 2

test() begin

test() end

t1.i = 1

t1.j = 2

test() begin

test() end

pt->i = 1

pt->j = 2

小結:

1)每個物件在使用之前都應該初始化

2)類的建構函式用於物件的初始化

3)建構函式與類同名並且沒有返回值

4)建構函式在物件定義時自動被呼叫

17 物件的構造

如果沒有賦初值,全域性儲存區的成員變數初始值系統預設為0,棧空間和堆空間上成員變數初始值系統預設為隨機數。從程式設計的角度,物件只是變數,c 中可以定義與類名相同的特殊成員函式 建構函式。建構函式沒有任何返回型別的宣告。建構函式在物件定義時自動呼叫。每個物件在使用之前都應該初始化,建構函式用於物件初...

物件的構造 上

類是一種特殊的自定義型別,自定義型別遵守c語言中所有資料型別的操作,也可以用來定義指標,這種特殊的自定義類可以用來定義變數,從物件導向的角度就是例項化乙個物件了,從程式的本質上來將就是定義乙個自定義型別的變數,既然是變數它就需要占用儲存空間,占用什麼區域的儲存空間和c語言中的說法一致,即區域性變數在...

17 物件的構造(中)

1 建構函式 建構函式和普通函式的區別 普通函式的函式名可以隨機定義,而建構函式的函式名和類名一致 普通函式有返回值,而建構函式沒有返回值 普通函式可以定義引數,那麼建構函式可以定義引數嗎?class test test t 定義物件並呼叫建構函式 int main 我們的整個編譯過程分為好幾步 1...