c 中類物件的構造和析構

2021-10-04 17:54:22 字數 4203 閱讀 4786

建立乙個物件時,常常需要作某些初始化的工作,例如對資料成員賦初值。注意,類的資料成員是不能在宣告類時初始化的。

為了解決這個問題,c++編譯器提供了建構函式(constructor)來處理物件的初始化。建構函式是一種特殊的成員函式,與其他成員函式不同,不需要使用者來呼叫它,而是在建立物件時自動執行。

建構函式

1、建構函式定義及呼叫

(1)c++中的類可以定義與類名相同的特殊成員函式,這種與類名相同的成員函式叫做建構函式;

(2)建構函式在定義時可以有引數;

(3)沒有任何返回型別的宣告。

2、建構函式的呼叫

自動呼叫:一般情況下c++編譯器會自動呼叫建構函式

手動呼叫:在一些情況下則需要手工呼叫建構函式

析構函式

1、析構函式定義及呼叫

(1)c++中的類可以定義乙個特殊的成員函式清理物件,這個特殊的成員函式叫做析

語法:~classname()

(2)析構函式沒有引數也沒有任何返回型別的宣告

(3)析構函式在物件銷毀時自動被呼叫

2、析構函式呼叫機制

c++編譯器自動呼叫

#define  _crt_secure_no_warnings 

#include

using

namespace std;

class

test

void

print()

//析構函式

~test()

cout<<

"我是析構函式,被呼叫了"

<}protected

:private

:int a ;

char

*p;}

;//給物件搭建乙個舞台,研究物件的行為

void

objplay()

void

main()

c++編譯器構造析構方案 vs 物件顯示初始化方案

1、為什麼需要設定建構函式和析構函式?

物件導向的思想是從生活中來,手機、車出廠時,是一樣的。生活中存在的物件都是被初始化後才上市的;初始狀態是物件普遍存在的乙個狀態的。

2、是如何設定初始化的?普通方案:

為每個類都提供乙個public的initialize函式;

物件建立後立即呼叫initialize函式進行初始化

3、優缺點分析

initialize只是乙個普通的函式,必須顯示的呼叫

一旦由於失誤的原因,物件沒有初始化,那麼結果將是不確定的,沒有初始化的物件,其內部成員變數的值是不定的

不能完全解決問題

//為什麼物件需要初始化 有什麼樣的初始化方案

#include

"iostream"

using

namespace std;

class

test21

void

setm

(int val)

int n;

intgetn()

const

void

setn

(int val)

public

:int

init

(int m,

int n)

protected

:private:}

;int

main()

;system

("pause");

return0;

}

1、無引數建構函式

2、有參建構函式

#include

using

namespace std;

//有引數建構函式的三種呼叫方法

class

test5

test5

(int a,

int b)

public:}

;int

main55()

3、拷貝構造函式呼叫時機

賦值建構函式的四種呼叫場景

第一和第二個呼叫場景

#include

"iostream"

using

namespace std;

class

first

//有參建構函式 預設建構函式

first

(int a)

first

(const first &obj2)

~first()

void

geta()

protected

:private

:int m_a;};

//建立乙個函式實現第一種呼叫方法

void

objplay01()

intmain()

第二種應用場景

class

second

//有參建構函式 預設建構函式

second

(int b)

second

(const second &obj2)

~second()

void

getb()

protected

:private

:int m_b;};

//建立乙個函式實現第二種呼叫方法

void

objplay02()

intmain()

第三種應用場景

#include

"iostream"

using

namespace std;

class

third

//複製建構函式

third

(const third & p)

~third()

intgetx()

intgety()

private

:int x, y;};

void

f(third p)

void

objplay03()

intmain()

第四種應用場景

第四個應用場景

#include

"iostream"

using

namespace std;

class

forth

//賦值建構函式

forth

(const forth & p)

~forth()

intgetx()

intgety()

private

:int x, y;};

void

f(forth p)

forth g()

//物件初始化操作 和 「=」等號操作 是兩個不同的概念

//匿名物件的去和留,關鍵看,返回時如何接

void

mainobjplay()

intmain()

4、預設建構函式

二個特殊的建構函式

1)預設無參建構函式

當類中沒有定義建構函式時,編譯器預設提供乙個無參建構函式,並且其函式體為空。

2)預設拷貝建構函式

當類中沒有定義拷貝建構函式時,編譯器預設提供乙個預設拷貝建構函式,簡單的進行成員變數的值複製。

當類中沒有定義任何乙個建構函式時,c++編譯器會提供預設無參建構函式和預設拷貝建構函式。

當類中定義了拷貝建構函式時,c++編譯器不會提供無引數建構函式

當類中定義了任意的非拷貝建構函式(即:當類中提供了有參建構函式或無參建構函式),c++編譯器不會提供預設無參建構函式

預設拷貝建構函式成員變數簡單賦值

總結:

只要你寫了建構函式,那麼你必須用。

構造析構階段性總結

建構函式是c++中用於初始化物件狀態的特殊函式

建構函式在物件建立時自動被呼叫

建構函式和普通成員函式都遵循過載規則

拷貝建構函式是物件正確初始化的重要保證

必要的時候,必須手工編寫拷貝建構函式

C 多個物件構造 析構 構造和析構的順序

include 多個物件構造和析構 1 當類中有成員變數是其它類的物件時,首先呼叫成員變數的建構函式,呼叫順序與宣告順序相同 之後呼叫自身類的建構函式 2 析構函式的呼叫順序與對應的構造函式呼叫順序相反 2 類成員中若有const修飾,必須在物件初始化的時候,給const int n 賦值 當類成員...

類和物件 構造析構函式

a.類和物件 1.關鍵字class表明正宣告乙個類,類中資料成員 屬性 和資料功能 行為 經過封裝,使得使用者通過外部介面訪問。2.類的封裝隱藏了實現細節,同時也保證了資料的安全性。3.只要類的外部介面不變,內部實現細節再怎麼修改,使用類庫的程式也不用修改。4.物件是類型別的變數。5.內聯成員函式 ...

C 物件的構造和析構

一 建構函式 1 宣告 1 c 中的類可以定義與類名相同的特殊成員函式,這種與類名相同的成員函式叫做建構函式 語法 classname 2 建構函式在定義時可以有引數 3 沒有任何返回型別的宣告。2 呼叫 自動呼叫 一般情況下c 編譯器會自動呼叫建構函式 手動呼叫 在一些情況下則需要手工呼叫建構函式...