4 2建構函式與析構函式

2021-10-16 17:48:35 字數 3458 閱讀 4310

物件的初始化和清理工作室編譯器強制要我們做的事情,因此如果我們不提供構造和析構,編譯器會提供。編譯器提供的建構函式和析構函式是空實現。(不管你寫還是別人寫,編譯器都會自動呼叫者兩個函式)

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

析構函式:主要作用在於物件銷毀前系統自動呼叫,執行一些清理作用。

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

1.建構函式,沒有返回值也不寫void

2.函式名稱與類名相同

3.建構函式可以有引數,因此可以發生過載

4.程式在呼叫物件時候會自動呼叫構造,無需手動呼叫,而且只會呼叫一次

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

1.析構函式,沒有返回值也不寫void

2.函式名稱與類名相同,在名稱前加上符號~

3.析構函式不可以有引數,因此不可以發生過載

4.程式在物件銷毀前會自動呼叫析構,無須手動呼叫,而且只會呼叫一次

兩種分類方式:

按引數分為:有參構造(預設構造)和無參構造

按型別分為:普通構造和拷貝構造

person()

person

(int a)

//拷貝建構函式

person

(const person &p)

~person()

int age;};

void

test01()

intmain()

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

使用乙個已經建立完畢的物件來初始化乙個新物件

值傳遞的方式給函式引數傳值

以值方式返回區域性物件

#include

using

namespace std;

class

person

person

(int age)

person

(const person &p)

~person()

int m_age;};

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

void

test01()

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

void

dowork

(person p)

void

test02()

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

person dowork2()

void

test03()

intmain()

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

1.預設建構函式

2.預設析構函式

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

如果我們寫了有參建構函式,編譯器就不再提供預設構造,依然提供拷貝構造

如果我們寫了拷貝建構函式,編譯器就不再提供其他普通建構函式。

淺拷貝:簡單的賦值拷貝操作,編譯器預設實現的拷貝操作

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

析構**使用時機:如果堆區有記憶體,需要在析構**裡把堆區記憶體釋放

#include

using

namespace std;

class

person

person

(int age,

int height)

//自己實現拷貝建構函式 解決淺拷貝帶來的問題

person

(const person &p)

~person()

cout <<

"person的析構函式呼叫"

<< endl;

}int m_age;

int* m_height;

//身高};

void

test01()

intmain()

總結:如果屬性有在堆區開闢的,一定要自己提供拷貝建構函式,防止淺拷貝帶來的問題。

作用:c++提供了初始化列表語法,用來初始化屬性

語法:建構函式():屬性1(值1),屬性2(值2)…{}

#include

using

namespace std;

//初始化列表

class

person

person

(int a,

int b,

int c)

:m_a

(a),

m_b(b)

,m_c

(c)int m_a;

int m_b;

int m_c;};

void

test01()

intmain()

c++類中的成員可以是另乙個類的物件,我們稱該成員為物件成員

class a{}

class b

b類中有物件a作為成員,a為物件成員。

那麼當建立b物件時,a與b的構造和析構的順序是誰先誰後?

#include

using

namespace std;

#include

//類物件作為類成員

class

phone

~phone()

string m_pname;};

class

person

~person()

string m_name;

phone m_phone;};

//當其他類物件作為本類成員,構造時候先構造類物件,再構造自身,析構的順序與構造相反

void

test01()

intmain()

靜態成員就是在成員變數和成員函式前加上關鍵字static,稱為靜態成員

靜態成員變數

所有物件共享同乙份資料

在編譯階段分配記憶體

類內宣告,類外初始化

靜態成員函式

所有物件共享同乙個函式

靜態成員函式只能訪問靜態成員變數

#include

using

namespace std;

//靜態成員函式

//所有物件共享同乙個函式

//靜態成員函式只能訪問靜態成員變數

class

person

static

int m_a;

//靜態成員變數

int m_b;

//非靜態成員變數

//靜態成員函式也是有訪問許可權的

private

:static

void

func2()

};int person::m_a =0;

void

test01()

intmain()

建構函式與析構函式

建構函式 主要作用就是為物件初始化。有一點要說的是,在繼承體系彙總,如果在建構函式中,如果沒有指定基類的建構函式,那麼編譯器會在建構函式開頭加入,基類的預設建構函式,這樣就可以初始化基類物件部分 析構函式 對於析構函式,要說的多點,實際也不太複雜,就是加入了virtual 使其具有了多型性質 inc...

建構函式與析構函式

建構函式 先看看建構函式的呼叫順序規則,只要我們在平時程式設計的時候遵守這種約定,任何關於建構函式的呼叫問題都能解決 建構函式的呼叫順序總是如下 1.基類建構函式。如果有多個基類,則建構函式的呼叫順序是某類在類派生表中出現的順序,而不是它們在成員初始化表中的順序。2.成員類物件建構函式。如果有多個成...

建構函式與析構函式

概述 乙個類有兩種特殊的成員函式 建構函式與析構函式。建構函式功能是在建立物件時,給資料成員賦初值,即物件的初始化。析構函式的功能是釋放乙個物件,在物件刪除前,用它做一些記憶體釋放工作,與建構函式的功能相反。建構函式 在物件建立時它會被自動執行,因此變數 物件的初始化 一般都放在建構函式中。1 物件...