注:部落格中內容主要來自《狄泰軟體學院》,部落格僅當私人筆記使用。
測試環境: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...