C 學習8 建構函式的引數初始化表

2022-07-16 10:21:15 字數 2232 閱讀 5251

建構函式是一種特殊的成員函式,在建立物件時自動執行,主要用來進行初始化工作,例如對 private 屬性的成員變數賦值。

對成員變數的初始化,除了在建構函式的函式體中一一賦值,還可以採用引數初始化表。請看下面的**:

class

student;

//在建構函式中採用引數初始化表

student::student(char *name1, int age1, float

score1):name(name1), age(age1), score(score1){}

void

student::say()

如本例所示,在定義帶參建構函式 student(char *name1, int age1, float score1) 時,不再是在函式體中對成員變數一一賦值,其函式體為空。在函式首部與函式體之間增添了乙個冒並加上 name(name1), age(age1), score(score1) 語句,這個語句的意思相當於函式體內部的 name = name1; age = age1; score = score1; 語句。

引數初始化表還有乙個很重要的作用,那就是為 const 成員變數初始化。例如:

class

array;

private

:

const

intlength;

int *num;

};

在本例中array類宣告了兩個成員變數,length 和 num 指標,需要注意的是 length 加了 const 關鍵字修飾。此時預設建構函式再為 length 賦值為 0,這是無法通過編譯的

初始化 const 成員變數的唯一方法只有利用引數初始化表。例如:

class

array;

private

:

const

intlength;

int *num;

};

需要注意的是:引數初始化順序與初始化表列出的變數的順序無關,引數初始化順序只與成員變數在類中宣告的順序有關。

建立物件時系統會自動呼叫建構函式進行初始化工作,同樣,銷毀物件時系統也會自動呼叫乙個函式來進行清理工作(例如**建立物件時消耗的各種資源),這個函式被稱為析構函式。

析構函式(destructor)也是一種特殊的成員函式,沒有返回值,不需要使用者呼叫,而是在銷毀物件時自動執行。與建構函式不同的是,析構函式的名字是在類名前面加乙個」~「符號。

注意:析構函式沒有引數不能被過載因此乙個類只能有乙個析構函式。如果使用者沒有定義,那麼編譯器會自動生成。

析構函式舉例:

#include using

namespace

std;

class

student;

student::student(

char *name1, int age1, float

score1):name(name1), age(age1), score(score1){}

student::~student()

void

student::say()

intmain()

可以看出,析構函式在 main 函式執行結束前被執行,並且呼叫順序和建構函式正好相反,為了方便記憶,我們可以將之理解為乙個棧,先入後出

析構函式在物件被銷毀前執行;要知道析構函式什麼時候被呼叫,就要先知道物件什麼時候被銷毀。

物件可以認為是通過類這種資料型別定義的變數,它的很多特性和普通變數是一樣的,例如作用域、生命週期等。由此可以推斷,物件這種變數的銷毀時機和普通變數是一樣的。

總結起來,有下面幾種情況:

1) 如果在乙個函式中定義了乙個物件(auto 區域性變數),當這個函式執行結束時,物件就會被銷毀,在物件被銷毀前自動執行析構函式。

2) static 區域性物件在函式呼叫結束時並不銷毀,因此也不呼叫析構函式,只有在程式結束時(如 main 函式結束或呼叫 exit 函式)才呼叫 static 區域性物件的析構函式。

3) 如果定義了乙個全域性物件,也只有在程式結束時才會呼叫該全域性物件的析構函式。

4) 如果用 new 運算子動態地建立了乙個物件,當用 delete 運算子釋放該物件時,先呼叫該物件的析構函式

注意:析構函式的作用並不是刪除物件,而是在撤銷物件占用的記憶體之前完成一些清理工作,使這部分記憶體可以分配給新物件使用。

建構函式 引數初始化列表

建立類物件時會自動呼叫建構函式 建構函式不需且不能手動呼叫 預設建構函式 在建立物件時不必給出實參的建構函式。包括無參建構函式和全部引數都有預設值的建構函式。如果使用者沒有定義建構函式,則系統會自動提供乙個預設建構函式,即上述的無參建構函式,函式體為空。當給類中的私有常量定義時,必須通過引數初始化列...

(C )建構函式初始化

vc 中的對於類的定義是有很大的不同。例如在.net程式中對於需要初始化的引數可以直接的賦值,而在vc 中對於需要初始化的引數則需要使用不同的方法。例如對於char字元則需要使用strcpy s函式賦值而相反對於布林型別 bool 整數型別 int 則可以使用運算子 對其初始化。1.定義乙個帶有引數...

C 建構函式初始化

建構函式後面增加冒號一般有三種作用 1 對成員變數的初始化 2 對類成員物件初始化 3 對父類進行初始化 include include using namespace std class a int get key int main 答案 class a 類物件初始化 int get key in...