作者:良知猶存
轉載請註明作者來源:https://mp.csdn.net/console/editor/html/10448795。
圍觀歡迎添加wx:Allen-Iverson-me-LYN
析構函數是C++類針對成員變量刪除時候執行的函數,析構函數與構造函數作用剛好相反,一個在定義變量的時候執行,一直在釋放的時候執行。在類裏面析構函數是默認定義好的,函數內部沒有任何執行的邏輯,它不會返回任何值,也不能帶有任何參數,只進行變量的釋放。如果你需要在析構函數裏面打印一些數據,可以重新定義一次析構函數。析構函數的名稱和類的名稱是完全相同的,只是在前面加個波浪號(~)最爲前綴,這時候我們自己定義好函數,在函數體內部就可以寫一些打印信息的操作。
析構函數正常與構造函數一一對應的使用,但是有些時候因爲程序賦值的問題,會導致變量多次釋放,造成程序運行錯誤。
下面是一個簡單的析構函數多次釋放的示例
class Point
{
private:
int x;
int y;
public:
Point()
{
std::cout << "/* Point() */" << std::endl;
}
Point(int x,int y) : x(x),y(y)
{
std::cout << "/* Point(int x,int y) */" << std::endl;
}
};
int main(int argc,char** argv)
{
Point p1(2,3);
Point p2 = p1;
return 0;
}
Point p1(2,3);
Point p2 = p1;
終端顯示效果
注意串口打印數據的
/* Point(int x,int y) */
/* ~Point() */釋放
/* ~Point() */再一次被釋放
此時候發現一個變量被釋放了兩次。下面分析一下原因:
p1 與 p2都爲Piont類型。
其中:p1:
.x = 2
.y =3
p2 = p1 屬於值的拷貝,並沒有進行地址切換
程序在執行完打印之後,分配的變量會自動用析構函數釋放
p2 與 p1指向同一處地址,然後會被釋放兩次,所以需要注意。
"="賦值造成了混亂,此時候,引入了重載函數
此時運算符的重載中,我們可以使用“=”重載函數,可以在類中進行友員等重載,也可以在類之外進行重載,使其 = 賦值的時候形成新的變量,這樣釋放的時候就不會多次釋放了。
本次實現在類裏面實現
考慮到返回值的效率小於返回引用,所以所以返回引用
Point& operator=(const Point& p)
{
cout << "operator=(const Point& p)" << endl;
if(this == &p)
return *this;
this->x = p.x;
this->y = p.y;
return *this;
}
在類裏面添加此重載函數,進行利用重載函執行“=”的時候,將變量信息地址重新申請定義,這樣變成兩個不同變量,再釋放就不會擔心多此釋放的問題了。
——END——