第三天之構造和析構函式

2021-09-29 10:08:41 字數 3839 閱讀 5722

建立乙個物件時常常需要做某些初始化工作,例如對資料成員賦初值,

注意:類的資料成員是不能在宣告類的時候初始化的

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

有關建構函式

1建構函式定義及呼叫

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

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

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

2建構函式的呼叫

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

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

有關析構函式

3)析構函式定義及呼叫

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

語法:~classname()

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

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

4)析構函式呼叫機制

c++編譯器自動呼叫

#include using namespace std;

class test

~test() };

//給物件乙個舞台,讓物件被呼叫

設計建構函式和析構函式的原因物件導向的思想是從生活中來,手機、車出廠時,是一樣的。

生活中存在的物件都是被初始化後才上市的;初始狀態是物件普遍存在的乙個狀態的

普通方案:

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

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

優缺點分析

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

2)一旦由於失誤的原因,物件沒有初始化,那麼結果將是不確定的

沒有初始化的物件,其內部成員變數的值是不定的

3)不能完全解決問題

/* 建構函式的分類和呼叫 */

class test2

test2(int a)//無引數 無返回值

test2(int a,int b)// 無返回值

//賦值建構函式(拷貝建構函式)

test2(const test2& obj)// 無返回值

~test2()

public:

void printt()

private:

int m_a;

int m_b;

};int main()

第一二種呼叫時機

#include using namespace std;

class test2

test2(int a)//無引數 無返回值

test2(int a, int b)// 無返回值

//賦值建構函式(拷貝建構函式)

test2(const test2& obj)// 無返回值

~test2()

public:

void printt()

private:

int m_a;

int m_b;

};/* 賦值建構函式 用乙個物件去初始化另乙個物件 */

第三種呼叫時機

#include "iostream"

using namespace std;

class location

//複製建構函式 完成物件的初始化

location(const location & p)

~location()

int getx()

int gety()

private:

int x, y;

};//業務函式 形參是乙個元素

第四種呼叫時機

#include "iostream"

using namespace std;

class location

//複製建構函式 完成物件的初始化

location(const location & p)

~location()

int getx()

int gety()

private:

int x, y;

};//業務函式 形參是乙個元素

void f(location p)

void mainobjplay()//第三種

//業務函式 第四種呼叫時機用 返回乙個元素

//結論1:函式的返回值是乙個元素(複雜資料型別,返回的是乙個新的匿名物件,所以會呼叫匿名物件類的拷貝建構函式

//結論2:有關匿名物件的去和留:關鍵看,返回時如何接

//如果用匿名物件初始化另乙個同型別的物件,那麼匿名物件直接轉成這個有名物件

//如果用匿名物件賦值給另外乙個同型別的物件,那麼匿名物件會馬上被析構

location g()

//第四種呼叫時機的第乙個場景

void objplay()

//第四種呼叫時機的第二個場景

二個特殊的建構函式

1)預設無參建構函式

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

2)預設拷貝建構函式

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

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

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

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

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

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

構造析構階段性總結

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

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

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

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

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

C 之建構函式和析構函式

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

C 之建構函式和析構函式

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

C 第三章 建構函式和析構函式

3.1 建構函式 1.目的 對資料成員初賦值 建構函式是乙個公有成員函式 建構函式是自動完成的。建構函式是由使用者定義的特殊的成員函式。2.建構函式的格式 1.類名 參數列 time int h,int w,int l 2.建構函式必須與類名相同 建構函式沒有返回值 功能是對物件初始化 建構函式是系...