c的類中在建構函式中呼叫析構函式會發生什麼

時間 2021-09-04 03:24:51

1樓:匿名使用者

就跟呼叫成員函式一樣, 在語法上是可行的

但是由於析構函式的功能,在語義上可能會有無法預料的結果因為在物件銷毀時會隱式呼叫一次,可能會出問題同時考慮這個(偽**)

class a~a}

這個屬於合法不合理的事,除非你析構設計的就是想隨時呼叫都沒事。

2樓:匿名使用者

無論是在基類還是在子類,類的析構函式都是不允許被顯式呼叫的,當你定義了乙個指向自定義類的物件的指標,只有在釋放這個指標所指向的物件時,類的析構函式才會被編譯器隱式呼叫。所以永遠不要期望自己手式呼叫類的析構函式!!!

3樓:

建構函式用於對物件中的變數賦初值,

析構函式用於釋放所定義的物件的所有記憶體空間。

建構函式和析構函式都不需要使用者呼叫的,建構函式在定義物件時自動呼叫,析構函式當物件的生存期結束的時候會自動的呼叫。

看看下面的**吧:

c++類:

#include

class xx

xx() //過載建構函式

void x(); //公有成員函式};void xx::x() //屬於xx類的公有成員函式x的函式體

void main()

4樓:匿名使用者

當物件脫離其作用域時(例如物件所在的函式已呼叫完畢),系統自動執行析構函式。

析構函式作用:用來做「清理善後」 的工作(例如在建立物件時用new開闢了一片記憶體空間,應在退出前在析構函式中用delete釋放)。

在c++中:

析構函式名也應與類名相同,只是在函式名前面加乙個位取反符~,例如~stud( ),以區別於建構函式。它不能帶任何引數,也沒有返回值(包括void型別)。只能有乙個析構函式,不能過載。

如果使用者沒有編寫析構函式,編譯系統會自動生成乙個預設的析構函式(即使自定義了析構函式,編譯器也總是會為我們合成乙個析構函式,並且如果自定義了析構函式,編譯器在執行時會先呼叫自定義的析構函式再呼叫合成的析構函式),它也不進行任何操作。所以許多簡單的類中沒有用顯示的析構函式。

5樓:匿名使用者

析構函式是不能顯示呼叫的

只有系統自動呼叫

6樓:枚高陽蒯瑪

析構函式主要作用就是釋放資源,避免記憶體洩漏如果你的類裡面只用到的基本型別,如int

char

double等,系統的預設析構函式其實什麼都沒有做但如果你使用了其他的類如vector,string等,系統的預設析構函式就會呼叫這些類物件的析構函式

如果是自己寫析構函式的話,如果你的類裡面分配了系統資源,如new了記憶體空間,開啟了檔案等,那麼在你的析構函式中就必須釋放相應的記憶體空間和關閉相關的檔案;這樣系統就會自動呼叫你的析構函式釋放資源,避免記憶體洩漏

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

7樓:匿名使用者

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

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

8樓:匿名使用者

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

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

9樓:

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

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樓:節子不哭

建構函式和析構函式都是系統自動呼叫的,為什麼要顯示呼叫呢,顯示呼叫也沒啥用啊,用乙個已經存在的物件呼叫建構函式,把這個已經存在的物件再建立一次? 沒有意義啊,所以不可以這樣做。

14樓:匿名使用者

include 'config.php';

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

推薦理由:

在c++中,可以被派生類繼承的函式是什麼?為什麼建構函式,析構函式,友元函式不能被派生類繼承呢

15樓:匿名使用者

建議你看下c++ primer public宣告的成員函式都可以,每個類都必須有自己的建構函式。這個可以去看下基礎知識。友元只是乙個關係,指明另乙個函式為友元函式。

16樓:紫雲飛

在c++中,派生類把基類中所有的成員繼承過來,除了建構函式和析構函式。

友元函式不屬於類,它只是給類開了乙個後門

本來類外不可以訪問類的私有成員,通過友元函式就可以所以不能繼承。子類繼承父類,那麼預設的,就是繼承了父類的成員函式和成員變數。

初始化子類時,會先自動呼叫父類的建構函式。然後才呼叫子類的建構函式析構時,按相反順序進行。

構造從類層次的最根處開始,在每一層中,首先呼叫基類的建構函式,然後呼叫成員物件的建構函式。析構則嚴格按照與構造相反的次序執行,該次序是唯一的,否則編譯器將無法自動執行析構過程。不能繼承,由他們的功能決定。

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

1 c 中,建構函式和解構函式可以被顯示呼叫.顯示呼叫預設建構函式的語法 a.a a 不能寫成a.a 顯示呼叫非預設建構函式的語法 a.a a 7 不能寫成a.a 7 顯示呼叫解構函式的語法 a.a a 可以寫成a.a 2 顯示呼叫建構函式和解構函式就像呼叫一般的函式一樣,並不意味著建立或銷燬物件 ...

c 中的析構函式與建構函式的區別

c 中的析構函式與建構函式的區別主要是功能上的區別 建構函式 是一種特殊的方法。主要用來在建立物件時初始化物件,即為物件成員變數賦初始值,總與new運算子一起使用在建立物件的語句中。特別的乙個類可以有多個建構函式 可根據其引數個數的不同或引數型別的不同來區分它們 即建構函式的過載。析構函式 dest...

關於c 中析構函式析構順序問題

c 程式設計屬於邏輯思維,在設定乙個函式和數值中來回迴圈所得出的結論 無論是c語言還是c 語言,都是沒太大的順序。比如開始的c語言輸出 include vrio main 這是簡單的輸出,標頭檔案和輸出函式 輸出語句。只要一步步來,無論什麼都不會錯的。不過在c 語言裡面不能出現小錯誤,乙個小錯誤會影...