物件的構造 上

2021-10-03 06:56:11 字數 1707 閱讀 4652

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

例子:

#include

class

test

intgetj()

};test gt;

intmain()

編譯結果:

sice@sice:~/dt$ g++ a.cpp

sice@sice:~/dt$ ./a.out

gt.i = 0

gt.j = 0

t1.i = 0

t1.j = 134514073

pt->i = 0

pt->j = 0

可以知道t1就是區域性變數,它占用的空間在棧上面,既然它在棧上面占用了儲存空間,它的成員變數又沒有初始值,自然它們的初始值就不確定了,gt物件在是個全域性變數初始化為0,new跟c語言中的malloc大同小異,本質上也是向堆空間申請記憶體,pt指向堆空間裡面申請的test型別的物件,在我們之前學習中在堆空間得到的變數的初始值是不定的,這裡為0只是g++編譯器在linux平台下的優化,delete相當於free,用於堆空間的釋放

一般而言,物件都需要乙個確定的初始化狀態(類似手機類裡面的iphone4s物件有出廠設定的初始狀態一樣),我們怎麼使得無論在**建立物件,物件的成員的初始值都為0呢?

解決方案

在類中提供乙個public的initialize函式

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

#include

class

test

intgetj()

void

initialize()

};test gt;

intmain()

優化方案我們的initialize函式必須在物件建立後就呼叫,那就存在人工的疏忽,我們需要將它自動化,所以c++裡面提供了建構函式,建構函式的函式名與類名相同,構造沒有任何返回型別的宣告,建構函式在物件定義時自動被呼叫

**:

#include

class

test

intgetj

(void

)test()

};test a;

intmain

(void

)

結果:

sice@sice:~/dt$ ./a.out 

test(

) begin

test(

) end

a.i = 2

a.j = 1

test(

) begin

test(

) end

b.i = 2

b.j = 1

test(

) begin

test(

) end

c->i = 2

c->j = 1

17 物件的構造(上)

注 部落格中內容主要來自 狄泰軟體學院 部落格僅當私人筆記使用。測試環境 ubuntu 10.10 gcc版本 4.4.5 一 問題 物件中成員變數和初始值是多少?二 小實驗 1 下面的類定義中成員變數i和j的初始值是什麼?class test int getj 程式設計實驗 成員變數的初始化 17...

同步構造 上篇

這些內容說實話,我自己還不是很明白 但是我腦海裡初戀了兩個小人 第乙個小人說 別老是停留在自己會的那個階段 有時候稍微搞搞你不明白的東西對你來說是一種進步 第二個小人說 第乙個小人說得對啊 mutex就像乙個 c lock一樣,不同的是它可以跨程序 進入和釋放乙個mutex 要花費幾毫秒 大約比c ...

物件的構造

構造物件時對物件的初始化,構造物件時被jvm自動呼叫 1.方法名與類名相同 2.沒有返回值 3.定義乙個類時,系統會預設提供乙個無參的建構函式,當使用者自定義了有參的建構函式時,無參的建構函式會被覆蓋 例如 public myclass 形參 new 建構函式時 1.根據建構函式找到建構函式所屬的類...