什麼是析構函數 創建對對象時,系統會自動調用構造函數為我們進行初始化,同樣,在銷毀對象時也會自動調用一個函數為我們收尾,如釋放記憶體等,這個函數是析構函數。 析構函數也是一種特殊的成員函數。 特點 析構函數的名稱和類的名稱相同,在前面加 析構函數沒有返回值,無參數 析構函數只能在類中使用,且只有一個參 ...
什麼是析構函數
創建對對象時,系統會自動調用構造函數為我們進行初始化,同樣,在銷毀對象時也會自動調用一個函數為我們收尾,如釋放記憶體等,這個函數是析構函數。
析構函數也是一種特殊的成員函數。
特點
- 析構函數的名稱和類的名稱相同,在前面加
~
- 析構函數沒有返回值,無參數
- 析構函數只能在類中使用,且只有一個參數
- 不能繼承和重載析構函數
- 析構函數不能顯性調用
什麼時候調用析構函數
- 對象生命周期結束被銷毀時
#include <bits/stdc++.h>
using namespace std;
class A {
public :
A(){ printf("A()\n"); }
~A() { printf("~A()\n"); }
};
int main() {
A a;
printf("do sth\n");
return 0;
}
輸出
A()
do sth
~A()
- 主動delete指向對象的指針時
我們用new創建了一個指向對象的指針,如果不主動delete,像這樣
#include <bits/stdc++.h>
using namespace std;
class A {
public :
A(){ printf("A()\n"); }
~A() { printf("~A()\n"); }
};
int main() {
A *p = new A;
printf("do sth\n");
return 0;
}
會輸出
A()
do sth
調用delete釋放空間時會調用析構函數
#include <bits/stdc++.h>
using namespace std;
class A {
public :
A(){ printf("A()\n"); }
~A() { printf("~A()\n"); }
};
int main() {
A *p = new A;
printf("do sth\n");
delete p;
return 0;
}
輸出
A()
do sth
~A()
- 對象A是對象B的成員,B的析構函數被調用時,A的也會被調用
#include <bits/stdc++.h>
using namespace std;
class A {
public :
A(){ printf("A()\n"); }
~A() { printf("~A()\n"); }
};
class B {
A a;
public :
B(){ printf("B()\n"); }
~B() { printf("~B()\n"); }
};
class C {
B a;
public :
C(){ printf("C()\n"); }
~C() { printf("~C()\n"); }
};
int main() {
C c;
return 0;
}
輸出
A()
B()
C()
~C()
~B()
~A()
構造函數是先調用類成員的,再調用自己的,析構函數是先調用自己的,再調用類成員的。