1樓:匿名使用者
讓我們來研究下這句話:
d=usercode(a);
編譯器看到這句話,首先執行=右邊的表示式,呼叫usercode函式。
1、由於這個函式的形參是按照值傳遞的,在呼叫的時候首先創造這個函式作用域的
形參變數,也就是demo usercode(demo b)裡面的b,這時候呼叫複製建構函式demo b(a);
2、在函式內部,demo c(b);這句再呼叫一次複製建構函式;
3、在函式執行完畢後,return c;這句話,建立了一個臨時的demo物件,這時候又呼叫了一次
複製建構函式,這個臨時物件通常被放置在cpu暫存器裡面,供主調函式使用。
2樓:回一句晚安
在以下3種情況下,會呼叫複製建構函式
1.使用一個已存在的物件去初始化該類的另一個物件2.當函式的形參是某類的物件時,在呼叫該函式時,實參物件向形參物件傳遞值,需要呼叫
3.如果函式的返回值是某類的物件,那麼在函式呼叫時,會呼叫複製建構函式
d=usercode(a);中,把實參a傳遞到形參b時,呼叫了一次(情況2),demo c(b);時是用b去初始化c,呼叫一次(情況1),這種情況還有種表示是demo c=b;return c時又呼叫了一次(情況3),一共呼叫了3次複製建構函式
3樓:希伯來爵
a作為實參拷貝構造了形參b,這裡呼叫了一次b拷貝構造了c,這裡又一次
第三次剛才說錯了:
函式返回值c需要拷貝到臨時儲存空間以賦給d,這裡需要呼叫一次總共3次
4樓:匿名使用者
樓上的前兩個說對了,但是第三個不是c拷貝構造了d,而是c拷貝給了一個臨時的物件(因為函式結束時,c會被釋放掉,需要一個臨時物件儲存c的值),這個臨時物件是返回給主調函式(這裡是main函式)使用的。
給d賦值時呼叫的是自動為類過載的賦值運算子,而不是複製建構函式。
c++程式中複製建構函式呼叫了幾次?
5樓:匿名使用者
書上說的是對的,你是用debug執行的吧?
test t=u,這裡呼叫了一次
return t和x=fun(y)要合起來看,debug下會產生一個臨時變數去得到fun(y)的返回值,然後再把臨時變數賦值給x,這裡就又呼叫一次;release下會優化這一過程,直接將fun(y)賦值給x,省去臨時變數,所以release下總共只呼叫一次。
c++這個複製建構函式,怎麼呼叫了2次呢
6樓:東郭廣英歸卯
來分析一下你的程式運**況。。
從main()開始,
第一行a&u
=ss();
首先呼叫
ss()函式,在函式裡面定義了一個變數w,呼叫的是2個引數的建構函式。
然後返回,看看返回型別,是a,是屬於值傳遞,恰好你做了一個複製建構函式
而你需要的是a&
所以編譯器會做無關緊要的轉換,把a
轉換成a&
這樣就開始了
第一個a(a&i)
然後主函式裡面是a&
u=又一次呼叫複製建構函式。
然後u就
引用了ss
裡面生成的值,但是在賦值完成的時候,ss函式就會消亡掉。
在ss裡面的變數的生存期已經沒了,
所以呢u引用的記憶體裡面是沒有東西或者被更改了。
c程式理解怎麼理解建構函式建構函式名字為什
建構函式是物件導向的程式設計中出現的一種方法,它是每個類都會有的方法,作用是構造及初始化物件。為了程式編譯時能很好地辨識這個必須的 建構函式 那這個建構函式的名字最好就有一定的規定。現在規定了建構函式名字和類名一致,編譯時就知道哪些是建構函式,例項化物件時就會呼叫合適的建構函式進行類的例項化。建構函...
C 呼叫特定建構函式的問題
其實這個問題可以利用一個專門類來解決,解決四路同上面老兄相同。下面是例子。比如class a a class b b class c static b create type3 a,type4 b,type5 c 每次要建立新類時,就呼叫 c create a,b c create a,b,c 還可...
幫忙除錯C語言程式,刪除陣列中的元素(函式呼叫),3Q
如果你只是刪掉為k的值,然後輸入的話,只要一個for迴圈就夠了,把不等於k的值直接輸出就行,不用再存入陣列裡了,如 include void main else printf d x i printf n include int count 9 main int flag int i int del...