A. c++析構函數在什麼時候自動調用
在對象被創建的時候就會調用構造函數,比如
聲明一個類class
a{...},當你在main函數中
a
a
;
定義一個對象a的時候,
就調用構造函數,默認構造函數都是無參數的
,構造函數就相當給對象a初始化而已,就相當於c語言中
int
a
=
3
初始化a的值而已,以為你在類中是不能直接給private中的類成員賦值的,所以就靠構造函數,不過要注意有參構造和無參構造,默認都是無參的,比如你a
a(1,
3)這樣的就不對了
除非你在類中寫一個帶參數的構造函數。
當函數調用結束的時候,會自動調用析構函數,比如你在clsaa
a
{
public:add().....},
當你a
a;
a.add();後
就自動調用析構,你可以在類中
~a{cout。。。},你就會發現調用
a.add()
後就打出你在析構函數中寫的東西,是自動調用的,析構的作用就是釋放對象佔用的資源。以為默認析構什麼也不列印,所以你不會直觀看出析構函數什麼時候執行,自己在析構中加上列印的語言你就會看到了。希望對你能有所幫助
B. C++類裡面如果不定義析構函數,那系統會自動執行嗎
如果你問的是有沒有析構 函數的存在,那麼答案是有。但是是默認的析構函數。裡面除了析構沒有任何其他語句。如果需要其他的操作,還得自己重載析構函數。
如果你問的是如果不用FREE來釋放對象,會不會自動釋放。不會。JAVA會
C. 析構函數為什麼在一創建對象時,就被自動執行了呢
人家不是廢話,你程序結束了,對象自動銷毀,於是調用了你的析構函數,你可以在$aaa = new aaa();後面加些輸出操作,看看是不是aaa是不是剛創建就銷毀了
D. 析構函數是自動調用嗎這個函數的作用是什麼
棧變數旦離作用域析構函數自調用
堆變數則需要調用delete釋放相關資源
函數釋放資源堆棧返給進程或者操作系統
E. 是一個對象時,這個成員變數的析構函數會被自動調用嗎
如果構造函數打開了一個文件,最後不需要使用時文件就要被關閉。析構函數允許類自動完成類似清理工作,不必調用其他成員函數。析構函數也是特殊的類成員函數。簡單來說,析構函數與構造函數的作用正好相反,它用來完成對象被刪除前的一些清理工作,也就是專門的掃尾工作。
F. 析構函數是自動調用嗎這個函數的作用是什麼
如果是在棧上的變數,一旦離開作用域,析構函數是會自動調用,
但如果是在堆上的變數,則需要調用delete方法來釋放相關資源
這個函數也就是釋放資源,將堆棧返回給進程或者操作系統
G. C++中構造函數和析構函數能不能被顯示調用
1、 C++中, 構造函數和析構函數可以被顯示調用. 顯示調用默認構造函數的語法: a.A::A();(不能寫成a.A();) , 顯示調用非默認構造函數的語法: a.A::A(7);(不能寫成a.A(7);); 顯示調用析構函數的語法: a.A::~A();(可以寫成a.~A();) .
2、 顯示調用構造函數和析構函數就像調用一般的函數一樣, 並不意味著創建或銷毀對象;
3、 如果構造函數中動態分配了空間, 則顯示調用構造函數會造成內存泄露. 創建對象時的隱式構造函數調用已經為對象分配了動態內存,當用創建好的對象顯示調用構造函數時, 對象指向的動態內存更新為顯示調用時所分配的, 對象生命周期結束時析構函數所釋放掉的是後一次分配的動態內存, 也就是說創建對象時隱式構造函數調用所分配的那塊內存泄漏了.
4、 如果析構函數中釋放動態分配的空間, 則會造成多次釋放同一內存, 會出現嚴重錯誤.
#include<iostream>
usingnamespacestd;
classA
{
public:
A()
{
cout<<"Defaultconstructoriscalled./r/n";
}
A(intix)
{
cout<<"Anotherconstructoriscalled./r/n";
}
~A()
{
cout<<"Destructoriscalled./r/n";
}
};
intmain()
{
Aa1;//<1>
a1.A::A();//<2>顯示調用默認構造函數(寫成a1.A()會報錯)
a1.A::A(7);//<3>顯示調用非默認構造函數(寫成a1.A(7)會報錯)
a1.A::~A();//<4>顯示調用析構函數,但是此時對象a1並沒有銷毀(寫成a1.~A()不會報錯)
//Aa2();//這樣寫沒報錯,但也沒調用任何構造函數和析構函數.
Aa3=A();//<5>完整寫法:Aa3=A::A();
Aa4(77);//<6>
Aa5=A(777);//<7>完整寫法:Aa5=A::A(777);
return0;//<8>,<9>,<10>,<11>return語句之後,右括弧之前析構函數被隱式調用.a1,a3,a4,a5對象在這里被銷毀.
}
H. 析構函數為什麼會自動再調用父類的析構函數
C++程序子類析構時會調用父類的析構函數。
析構函數調用的次序是先派生類的析構後基類的析構,也就是說在基類的的析構調用的時候,派生類的信息已經全部銷毀了定義一個對象時先調用基類的構造函數、然後調用派生類的構造 函數;析構的時候恰好相反:先調用派生類的析構函數、然後調用基類的析構函數。
析構函數:
析構函數(destructor) 與構造函數相反,當對象脫離其作用域時(例如對象所在的函數已調用完畢),系統自動執行析構函數。析構函數往往用來做「清理善後」 的工作(例如在建立對象時用new開辟了一片內存空間,應在退出前在析構函數中用delete釋放)。
I. C++析構函數何時會被調用
析構函數執行時機:1.當程序棧內對象被刪除時
2.手動調用析構函數時
要更詳細的理解機制,請嘗試:
#include <iostream>
using namespace std;
class Temp {
public :
Temp() { cout << "An object Temp build." << endl; }
~Temp() { cout << "An object Temp delete." << endl; }
Temp(Temp &A) { cout << "Copy from an object!Method 1!" << endl; }
void operator=(Temp &A) { cout << "Copy from an object!Method 2!" << endl; }
};
Temp test_a() {Temp test; return test; }
int main() {
Temp A;
Temp B = A;
Temp C(A);
Temp D = test_a();
return 0; }
程序運行結果因編譯器而異,可能的結果如下:
An object Temp build. // A
An object Temp build. // B
Copy from an object!Method 2! // B=A
Copy from an object!Method 1! // C(A)
An object Temp build. // D
An object Temp build. // temp
Copy from an object!Method 2! // D=temp
An object Temp delete. // temp
An object Temp delete. // D
An object Temp delete. // C
An object Temp delete. // B
An object Temp delete. // A