關於初始化成員變數的乙個測試
今天看書的時候看到說是:如果我們有乙個類成員,它本身是乙個類或者是乙個結構,而且這個成員它只有乙個帶引數的建構函式,而沒有預設建構函式,這時要對這個類成員進行初始化,就必須呼叫這個類成員的帶引數的建構函式,如果沒有初始化列表,那麼他將無法完成第一步,就會報錯。
剛開始不是很理解就按照書上的例子做啦乙個測試,**如下:(這個例子是用的初始化列表的形式初始化的。)
#include
#include
class
cpoint
void
showpos() };
class
csize
void
showsize()
public:
intnlength
;int
nwidth;};
class
crect
void
show()
private:
cpoint
ptcenter
;csize
size;};
intmain(
intargc,
char
*argv)
**執行的結果如下:
這個照著書上抄的程式肯定是對的啦!
然後書上說只能以初始化列表的方式進行初始化,我就做啦
如下測試,故意不用初始化列表,看最後的結果怎麼樣,**如下:
#include
#include
classcpoint
void
showpos()
};
classcsize
void
showsize()
public:
intnlength
;
intnwidth
;
};
classcrect
#endif
crect(
intleft,
inttop
,int
right
,int
bottom)
void
show()
private:
cpoint
ptcenter
;
csize
size
;
};
intmain(
intargc,
char
*argv)
但是這樣編譯的時候真的如上所說的錯誤啦。錯誤如下:
錯誤的意思就是說沒有找到預設的建構函式,因為要是我們自己過載啦建構函式,則預設建構函式消失,這樣我試著加啦兩個建構函式,如下:
cpoint()
csize()
呵呵,這兩個建構函式長得跟預設建構函式很像,因為裡面什麼語句都沒有加,這裡再編譯的時候,結果真的沒有錯誤啦!呵呵!輸出結果如下:
很顯然結果跟上面的結果一樣,就是說當我們自己過載了乙個類似於預設建構函式的建構函式之後是可以的。咋一看貌似很明了,但是看到上面的建構函式不禁又有乙個疑問?
crect(intleft,
inttop
,int
right
,int
bottom)
這個建構函式中的兩個等號難道不應該是要呼叫複製建構函式麼???於是我又給這兩個類分別加了乙個複製建構函式!如下:
cpoint(
cpoint
&cp)
csize(
csize
&cs)
但是這樣之後列印的結果還是如下:
意思就是說這兩個複製建構函式沒有被呼叫!鬱悶啦半天!最後終於弄明白啦!在網上看到這段文字:
因為類型別的資料成員物件在進入函式體前已經構造完成,也就是說在成員初始化列表處進行構造物件的工作,呼叫建構函式,在進入函式體之後,進行的是對已經構造好的類物件的賦值,又呼叫個拷貝賦值操作符才能完成(如果並未提供,則使用編譯器提供的預設按成員賦值行為)
這個上面說的很清楚,於是我在那個建構函式裡又加啦兩句列印,如下:
crect(
intleft,
inttop
,int
right
,int
bottom)
也就是說按照上面所說的話,在進入建構函式的時候,這個ptcenter
,size
已經有值的!於是執行啦這個程式,結果如下:
這個剛說應證啦上面的猜測,呵呵!這下也就理解啦!為何用初始化列表的效率高!
再就是注意複製與賦值的區別,複製是用乙個已經建立的物件(其實可以說已經初始化的)去建立乙個物件,而賦值則是對乙個已經建立的物件進行賦值操作改變其值!
為了測試我在主函式中加入如下語句,如下:
intmain(
intargc,
char
*argv)
執行的結果如下:
正如上面那裡,複製建構函式被呼叫!這下算是沒有疑問啦,呵呵!c++這個東西很難啃啊!記錄一下,怕以後忘記啦!
C 初始化列表學習
何謂初始化列表 與其他函式不同,建構函式除了有名字,引數列表和函式體之外,還可以有初始化列表,初始化列表以冒號開頭,後跟一系列以逗號分隔的初始化字段。在c 中,struct和class的唯一區別是預設的克訪問性不同,而這裡我們不考慮訪問性的問題,所以下面的 都以struct來演示。複製 如下 str...
c 初始化列表
與其他函式不同,建構函式除了有名字,引數列表和函式體之外,還可以有初始化列表,初始化列表以冒號開頭,後跟一系列以逗號分隔的初始化字段。struct foo 初始化列表 建構函式的兩個執行階段 從概念上來講,建構函式的執行可以分成兩個階段,初始化階段和計算階段,初始化階段先於計算階段 初始化階段 所有...
C 初始化列表
與其他函式不同,建構函式除了有名字,引數列表和函式體之外,還可以有初始化列表,初始化列表以冒號開頭,後跟一系列以逗號分隔的初始化字段。在c 中,struct和class的唯一區別是預設的克訪問性不同,而這裡我們不考慮訪問性的問題,所以下面的 都以struct來演示。struct foo 初始化列表 ...