C 學習小記之建構函式和析構函式

2021-10-22 16:55:27 字數 2388 閱讀 1740

物件的初始化和清理是非常重要的安全問題

建構函式:建立物件時為物件的成員屬性賦值,建構函式由編譯器自動呼叫,無需手動呼叫

析構函式:物件銷毀前自動呼叫,執行一些清理工作

當我們不提供構造和析構時,編譯器會提供,而編譯器提供的時空實現的

建構函式語法:類名(){}

無返回值也不寫void

函式名稱與類名相同

可以有引數,因此可以發生過載

程式再呼叫物件時候會自動呼叫,無須手動呼叫,而且僅會呼叫一次

析構函式語法:~類名(){}

無返回值也不寫void

函式名稱與類名相同,在前面加上~

不可以有引數,因此不可以發生過載

物件銷毀前自動呼叫析構,無需手動呼叫,且僅呼叫一次

#include

using

namespace std;

class

person

~person()

};void

test01()

//為區域性變數,函式呼叫後被立刻釋放,因此析構和建構函式都會被呼叫

intmain()

#include

using

namespace std;

class

person

person

(int a)

person

(const person& p)

~person()

//析構函式};

void

test01()

void

test02()

intmain()

c++中拷貝構造函式呼叫的時機通常有三種情況

#include

using

namespace std;

class

person

person

(int age)

person

(const person &p)

int age;

~person()

};//1.使用乙個已經建立完畢的物件來初始化乙個新的物件

void

test01()

//2.值傳遞的方式給函式引數傳值

void

dowork

(person p)

void

test02()

//3.值方式返回區域性物件

person dowork2()

void

test03()

intmain()

預設情況下,c++編譯器至少給乙個類新增3個函式

預設建構函式無參(函式體為空)

預設析構函式無參 (函式體為空)

預設拷貝建構函式,對屬性進行值拷貝

構造函式呼叫規則如下:

#include

using

namespace std;

class

person

person

(int age)

person

(const person &p)

int m_age;

~person()

};void

test01()

void

test02()

intmain()

淺拷貝:簡單的賦值拷貝

深拷貝:在堆區重新申請空間,進行拷貝操作

#include

using

namespace std;

class

person

person

(int age,

int height)

person

(const person &p)

int m_age;

int*m_height;

~person()

//此時會出錯,因為此時p1和p2的身高所指向的空間是同乙個空間,而當p2的析構函式釋放該處的記憶體後(先進後出p2先被釋放),p1的析構函式會再次釋放此記憶體,因此會出錯

//解決此問題應當自己寫拷貝函式,使得兩個函式指向的空間不同

cout <<

"person析構構造函式呼叫"

<;void

test01()

intmain()

C 學習之建構函式 析構函式

在c 的類中,都會有乙個或多個建構函式 乙個析構函式 乙個賦值運算操作符。即使我們自己定義的類中,沒有顯示定義它們,編譯器也會宣告乙個預設建構函式 乙個析構函式和乙個賦值運算操作符。例如 宣告乙個空類 class empty 但是這個空類和下面這個類是等同的 class empty 預設建構函式 e...

C 之建構函式和析構函式

我們已經知道了物件就是類的例項,二者的關係就相當於資料型別與它的變數的關係。每個物件區別於其他物件的地方就是依靠它的自身屬性,即資料成員的值。c 中,物件在定義的時候進行的資料成員的設定,稱為物件的初始化。同樣,在特定物件使用結束時,還要對資料成員進行一些清理工作。c 中對類的初始化和清理的工作,分...

C 之建構函式和析構函式

一 建構函式 1 物件的初始化和建構函式 類是一種抽象的資料型別,它不占用儲存空間,不能容納具體的資料。因此在類宣告中不能給資料成員賦初值。例如 錯誤 class complex 與使用變數一樣,使用物件時也應該先定義,後使用。在定義物件時,對資料成員賦初值,稱為初始化。例如 class compl...