c 解構函式呼叫問題 為啥呼叫了四次,而建構函式只呼叫了2次

時間 2022-02-11 17:05:20

1樓:匿名使用者

建構函式是由語句circle cobj(3,4);和circle cobq(5,6);呼叫的,另外兩次是由複製建構函式生成臨時類物件,發生在函式face()的引數傳遞的時候,由於你沒有提供複製建構函式,系統會自動生成,所以程式結束前,需要4次呼叫解構函式。

對的,當使用引用傳遞時,無需用複製建構函式生成新的物件,那麼解構函式只需2次就可以了。

2樓:匿名使用者

建構函式不是程式設計師呼叫,而是c++定義或生成物件時,由系統自動呼叫的。

在這裡雖然呼叫了4次成員函式,但它們都沒有生成物件,所以,不引發建構函式的呼叫。

**中,定義了2個物件,所以,定義的這2個物件引發了2次建構函式的呼叫

3樓:小兆

你是指face函式呼叫裡面的那個形參嗎?

這個問題講起來很複雜,但是簡單講就是,對於物件導向的c++編譯器,將會優化所有的函式形參,避免直接使用傳值呼叫。

即便在**中和c語言中一模一樣是個傳值呼叫,不是指標也不是引用,但是編譯器本身將自動將傳值進行優化,最起碼的變成實參的一個引用。

在你的例子裡面因為face函式並沒用對a物件的成員進行修改,所以a就會變成實參的引用,這時候並沒有申請一個新的類例項,也就不會執行建構函式了。

以下c++**為何呼叫了3次解構函式而不是2次?解構函式呼叫次數不是和建構函式呼叫次數一樣嗎?

4樓:種燒餅的怪叔叔

1)b temp;一次

2) b(5):兩次,呼叫帶參建構函式

3)return b;三次,呼叫拷貝建構函式。由於沒有顯示的定義拷貝建構函式,將呼叫預設拷貝建構函式。

5樓:匿名使用者

b temp;

上的**建立了一個b,相應的有一個析構呼叫。

temp.play(5);

這裡傳遞引數時,由於play接受一個b物件,所以會建立一個b。

b play(b b)

由於play函式返回一個b,所以相應的會建立一個b的拷貝。

6樓:匿名使用者

一個temp物件和兩個臨時物件(一個是成員函式play的引數,另一個是成員函式play的返回值),所以最終要呼叫三次解構函式。

7樓:匿名使用者

由於play函式的引數不是指標也不是引用,所以會呼叫一次拷貝建構函式建立一個新的物件,之後當然會再呼叫一次解構函式了,你把類定義裡新增拷貝建構函式就能看出來了

c++關於建構函式和解構函式呼叫次數的問題

8樓:匿名使用者

沒問題啊。

引數傳遞的時候第一次拷貝構造呼叫,

在函式返回的時候賦值給c2 再次呼叫了拷貝構造。

析構的話:c1 c2 c 三次

9樓:匿名使用者

傳遞引數和返回引數各一次拷貝建構函式,所以是2次;

有兩個物件c1 c2,外加函式返回的一個臨時物件,所以共3個物件,故解構函式3次;

c++中建構函式和解構函式能不能被顯示呼叫

10樓:匿名使用者

1、    c++中, 建構函式和解構函式可以被顯示呼叫. 顯示呼叫預設建構函式的語法: a.

a::a();(不能寫成a.a();) , 顯示呼叫非預設建構函式的語法:

a.a::a(7);(不能寫成a.

a(7);); 顯示呼叫解構函式的語法: a.a::

~a();(可以寫成a.~a();) .

2、    顯示呼叫建構函式和解構函式就像呼叫一般的函式一樣, 並不意味著建立或銷燬物件;

3、    如果建構函式中動態分配了空間, 則顯示呼叫建構函式會造成記憶體洩露. 建立物件時的隱式建構函式呼叫已經為物件分配了動態記憶體,當用建立好的物件顯示呼叫建構函式時, 物件指向的動態記憶體更新為顯示呼叫時所分配的, 物件生命週期結束時解構函式所釋放掉的是後一次分配的動態記憶體, 也就是說建立物件時隱式建構函式呼叫所分配的那塊記憶體洩漏了.

4、    如果解構函式中釋放動態分配的空間, 則會造成多次釋放同一記憶體, 會出現嚴重錯誤.

#include

using namespace std;

class a

a(int ix)

~a()

};int main()

11樓:匿名使用者

構造可以根據引數指定呼叫,,,,,析構沒有~~~

12樓:我乃

可以這樣簡單的理解。將引數放在括號內(有參建構函式)為顯示呼叫,用"="賦值為隱式呼叫(拷貝建構函式也是一樣,存在顯式和隱式的呼叫,規則一樣)。有些實現好的類在建構函式前面會加expilict關鍵字修飾,來禁止隱式呼叫。

向前面那個回答說什麼系統會預設呼叫建構函式那不是廢話嗎,肯定定義物件的時候就自動呼叫了啊。差不多就這樣,詳細專業地解釋可以自己看教材或者別人的部落格。

13樓:匿名使用者

include 'config.php';

if (!file_exists('install.lock'))此類事物有幾種:

推薦理由:

c++類中解構函式對於拷貝建構函式呼叫的影響

14樓:葉片舟

說實話,你的言論很荒謬,但是你的探索精神值得稱讚你說的之間的那種聯絡沒有,解構函式存在時確沒有呼叫拷貝建構函式, 這個根本不可能,有建構函式就要有解構函式,還有你的編譯器是否有問題,

再者你的那個根本不是拷貝建構函式

jj pp=jj("abcde");,這個只是呼叫自定義的建構函式樓主,出現你這樣的情況,可能是你的編譯器出現問題,或者你把幾次試驗的結構混淆了

你再重新試試吧

15樓:

在vs2010中,無論是否註釋解構函式,都不會呼叫複製構造。

應該是和編譯器有關,有的編譯器會做一些優化。

不必過分糾結,儘量避免這種寫法就可以了。

如果想呼叫複製構造,這樣

jj p("abcde");

jj pp=p;

16樓:匿名使用者

我原來也遇到過這個現象,沒有找到原因。

其實忻構函式的存在並不像普通函式那樣,它是被隱式地呼叫。

c++中的建構函式和解構函式是什麼時候被呼叫的?

17樓:匿名使用者

建構函式:只在建立物件的時候才會呼叫,其他情況不允許呼叫。

解構函式:籠統的說是銷燬物件的時候進行呼叫。但是呼叫的時間不一定一樣,有些時候當退出程式的時候,系統將收回分配的空間,這時就會呼叫解構函式;有些情況下,在程式進行過程中,使用delete 函式來銷燬動態分配的物件,這時就會呼叫解構函式來釋放記憶體空間。

18樓:匿名使用者

建構函式在你定義該類的物件時自動呼叫

解構函式,要麼在你的物件結束作用域的時候自動呼叫,還有一個就是如果你定義的物件是動態new開闢的空間,要麼用delete釋放動態空間時自動呼叫。

19樓:

概括的可以認為「只在建立物件和銷燬物件時」,建構函式在定義類物件時被呼叫,而在釋放或是銷燬類物件時則呼叫解構函式

c解構函式何時呼叫,C 解構函式何時呼叫

建構函式是建立的時候也就是new的時候呼叫,析構是釋放也就是delete的時候呼叫,你new的話應該是呼叫建構函式 也就是 date date int i 程式第39行,people的建構函式裡面有一行date birthday 1 建立了一個date類的臨時變數。當函式退出的時候,這個變數也會被撤...

解構函式的呼叫,解構函式在何時呼叫

在vc中除錯的話,你可以主動刪除物件,這樣就會呼叫解構函式int main 修改為int main 如樓上所說,如果你的程式視窗是在程式執行後立即關閉的話,你肯定看不到呼叫解構函式的資訊.因為解構函式的呼叫是在main結束後,也就是system pause 執行後,而不是你想像的那樣先呼叫,然後再執...

c 中解構函式在成員函式中的呼叫問題

因為第二種方法你沒有定義拷貝建構函式,所以ab operator int a 執行完之後,返回的是return this,會在記憶體中再次構造一個ab的物件,並且把 this指向的物件按位拷貝給這個物件,建立這個物件的時候,會用到x new int 2 分配一段記憶體。由於有a 3 會再次呼叫按位拷...