C 的建構函式與析構函式與拷貝建構函式

2022-03-18 05:02:16 字數 3256 閱讀 3410

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

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

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

3.預設拷貝建構函式(系統預設生成的拷貝建構函式,只負責進行簡單的賦值操作,即淺拷貝),對屬性進行值拷貝

構造函式呼叫規則如下:

1.建構函式的作用:(初始化時建構函式就開始發揮作用)

「建構函式用來處理物件的初始化。建構函式是一種特殊的成員函式,與其他成員函式不同,預設無引數的建構函式不需要使用者來呼叫它,而是在建立物件時自動執行。建構函式的功能是由使用者定義的,使用者根據初始化的要求設計函式體和函式引數。」

2.建構函式的注意事項:

①、建構函式的名字必須與類名同名,不能隨意命名,這樣的話才能讓編譯器認為該函式是建構函式,而不是類的普通成員函式;

②、建構函式不具有任何型別,不返回任何值,連 void 都不是;

③、預設的建構函式不需要使用者呼叫,它是物件建立的時候自動被系統呼叫,用來初始化剛剛建立的物件的;

④、如果使用者沒有定義自己的類的建構函式,那麼系統會自動生成乙個預設的建構函式,只不過該建構函式的函式體是空的,也就是什麼都不做。

總結:建構函式是用來初始化值的,用於類物件的。

**例子:

(1)呼叫無參建構函式

1

.class student

intmain()

2.class student

}int

main()

(2)呼叫有參建構函式

#include using

namespace

std;

class

student

student(

intage)

};int

main() ;//

陣列物件呼叫有引數的建構函式

}

執行結果:

2.析構函式(當生命週期快結束時才呼叫析構函式,可以理解建構函式與析構函式相反,一般用於記憶體釋放,清理空間)

析構函式也是乙個在類中跟建構函式類似的特殊功能的成員函式。只不過它的作用是與建構函式相反,是在物件的生命週期結束的時候會被自動呼叫的。在c++中析構函式的名字跟類名相同,並且前面帶上乙個取反的符號~,表達的意思也就是跟建構函式的過程相反。

預設情況下,如果類的設計者沒有自己定義析構函式,那麼編譯器會自動為該類生成乙個預設的析構函式,只不過函式體是空的,也就是什麼都沒做。所以,如果需要在物件被刪除的時候做一些操作的話,那麼就得自己定義析構函式嘍。

以下幾種情況會自動呼叫析構函式:

①、如果在乙個函式中定義了乙個區域性變數的物件,那麼當這個函式執行結束時也就是該變數物件生命週期結束的時候,所以析構函式會被自動呼叫;

②、全域性變數或者static型別的變數,他們的生命週期一般是在程式退出的時候,這時候該物件的析構函式才會被呼叫;

③、如果是用new操作符動態的建立了乙個物件,只有當用delete進行釋放該物件的時候,析構函式才會被呼叫;

析構函式的作用:

先拿建構函式來說話,建構函式是新建物件嗎?回答:不是,而是在物件被建立出來之後自動被呼叫的,用來初始化相關資訊的函式。同理,析構函式也不是用來刪除物件的,而是當物件被刪除的時候自動會被呼叫的,用來做一些物件被刪除之前的清理工作。只要物件的生命週期結束,那麼程式就會自動執行析構函式來完成這個工作的。

析構函式的特點:

析構函式不返回任何值,沒有函式型別,也沒有任何函式的引數。由於上面這些特點,所以析構函式不能被過載,所以說乙個類可以有多個建構函式,但只能有乙個析構函式。

#include using

namespace

std;

class

student

student(

intage)

~student()

};int

main() ;//

陣列物件呼叫有引數的建構函式

}

3.拷貝建構函式

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

class

person

person(

intage)

person(

const person&p)

//析構函式在釋放記憶體之前呼叫

~person()

public

:

intmage;

};//

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

void

test01()

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

//相當於person p1 = p;

void

dowork(person p1) {}

void

test02()

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

person dowork2()

void

test03()

intmain()

歸根到底就是,只要進行了初始化賦值操作就會呼叫拷貝建構函式。

重點:一般編譯器初始化形成的拷貝函式只會進行淺拷貝,這樣在使用拷貝操作時由於進行了淺拷貝(簡單的賦值操作),在結束時由於析構函式會釋放空間,會引發一些問題,比如指向同一位址的指標會進行多次析構,而造成出錯。

從而編譯器自己形成的淺拷貝的建構函式一般是不用的,而是自己進行複寫拷貝函式,解決淺拷貝多次呼叫析構函式後形成的記憶體錯誤問題,自己寫的建構函式稱為深拷貝建構函式。

**深拷貝與淺拷貝

淺拷貝:簡單的賦值拷貝操作

深拷貝:在堆區重新申請空間,進行拷貝操作(目的就是為了淺拷貝和析構函式多次析構同一記憶體位址引起來的記憶體多次釋放錯誤)

例子:

class

person

//有參建構函式

person(int age ,int

height)

//深拷貝建構函式

person(const person&p)

//析構函式

c 建構函式與析構函式

一 建構函式 c 提供建構函式來處理物件的初始化,建構函式是一種特殊的成員函式,與其他的成員函式不同,不需要使用者來呼叫他,而是在建立物件時自動執行。它的特點是 函式名和類名相同,沒有返回值,可以過載 如果程式中未宣告,則系統自動產生出乙個預設的建構函式,預設的建構函式時不帶引數的。比如 stude...

C 建構函式與析構函式

c 規定,每個類必須有預設的建構函式,沒有建構函式就不能建立物件。若沒有提供任何建構函式,那麼c 提供自動提供乙個預設的建構函式,該預設建構函式是乙個沒有引數的建構函式,它僅僅負責建立物件而不做任何賦值操作。只要類中提供了任意乙個建構函式,那麼c 就不再自動提供預設建構函式。類物件的定義和變數的定義...

C 建構函式與析構函式

建構函式 對於c 的建構函式,暫且將其分為以下幾類 1.預設建構函式 2.隱士轉換建構函式 3.拷貝建構函式 4.其它建構函式 1.預設建構函式表示沒有任何引數的建構函式,當自定義任何建構函式以後,將不再自動建立預設建構函式,當然,預設建構函式啥也不幹,程式設計師關心係數頓時大跌。關於預設建構函式還...