建構函式中引數初始化表與函式體賦值的區別

2021-07-25 23:22:06 字數 2201 閱讀 9330

1 常資料成員只能通過建構函式初始化表對其進行初始化

常資料成員只能通過建構函式初始化表對其進行初始化,任何其它函式都不能對常資料成員賦值。如類體中定義了常資料成員hour:

constint hour;//定義hour為常資料成員;

不能採用在建構函式中對常資料成員賦值的方法,下面的用法是非法的:

time::time(inth)

// 非法,不能對之賦值

因為常資料成員是不能被賦值的。

如果在類體外定義建構函式,應寫成如下形式:

time::time(inth):hour(h){} //通過引數初始化表對常資料成員hour初始化

常物件的資料成員都是常資料成員,因此在定義常物件時,建構函式只能用引數初始化表對常資料成員進行初始化。【???注意:在實際中常物件的資料成員是可以通過函式體進行初始化的】

—《c++物件導向程式設計(第2版)》p91-p92

分析:建構函式可以分為兩個階段:(1)初始化階段(利用初始化列表完成);(2){}函式體賦值階段。

所以:(

1)常資料成員只能通過建構函式的初始化表對其初始化;

(2)當資料成員是引用型別時,也只能使用建構函式的初始化表進行初始化。

2 如果資料成員是陣列,則應當在建構函式的函式體中用語句對其賦值,而不是在引數初始化表中對其初始化

c++中可以再建構函式的函式體重通過賦值語句對資料成員實現初始化。同時還提供另一種初始化資料成員方法—引數初始化表來實現對資料成員的初始化。這種方法不再函式體內對資料成員初始化,而是在函式首部實現的。如

box::box(inth, int w, int len)//

在類體外定義帶引數的建構函式

即在原來函式首部末尾加乙個冒號,然後列出引數的初始化表。上面的初始化表示:用形參h的值初始化資料成員height,用形參w值初始化資料成員width,用形參len的值初始化資料成員length。後面的花括號是空的,即函式體是空的,沒有任何執行語句。以上兩種建構函式的作用是相同的。用引數初始化表發可以減少函式體的長度,使建構函式顯得精煉簡單,這樣可以直接在類體重(而不是在類外)定義建構函式。

說明:如果資料成員是陣列,則應當在建構函式的函式體中用語句對其賦值,而不是在引數初始化表中對其初始化。如:

class student

private:

int num;

char ***;

char name[20];

—《c++物件導向程式設計(第2版)》p73-p74

3 靜態資料成員不能用引數初始化表對靜態資料成員初始化

(1) 如果宣告了類而未定義物件,則類的一般資料成員是不佔記憶體空間的,只有在定義物件時,才為物件的資料成員分配空間。但是靜態資料成員不屬於某乙個物件,在為物件所分配的空間中不包括靜態資料成員所佔的空間。靜態資料成員是在所有物件之外單獨開闢空間。只要在類中指定了靜態資料成員,即使不定義物件,也為靜態資料成員分配空間,它可以被引用。

(2) 靜態資料成員不隨物件的建立而分配空間,也不隨物件的撤銷而釋放(一般資料成員是在物件建立時分配空間,在物件撤銷時釋放)。靜態資料成員是在程式編譯時被分配空間的,至程式結束時才釋放空間。

(3) 靜態資料成員可以初始化,但只能在類體外進行初始化。

注意:靜態資料成員不能用引數初始化表對其初始化。如在定義box類中這樣定義建構函式是錯誤的:box(int h, int w, int len):height(h){}

(4) 靜態資料成員可以通過物件名引用,也可以通過類名引用。

—《c++物件導向程式設計(第2版)》p104-p105

分析:靜態資料成員可以初始化,但只能在類體外初始化,並且不能用引數初始化表對其初始化。

如: class box

public:

int volume();

private:

staticint height;

int width;

int length

int box::height = 10; //正確

box(inth, int w, int len):height(h){} //錯誤

靜態成員與物件無關,屬於整個類,建構函式是構造某個具體的物件。建立乙個物件的時候會用到初始化表,但是靜態成員在物件建立之前就已經存在了,所以不需要再初始化表中初始化。

C 建構函式中引數初始化表與函式體賦值的區別

一 使用引數初始化表並沒有效率上的優勢,僅僅是書寫方便。引數初始化表還有乙個很重要的作用,那就是初始化 const 成員變數。初始化 const 成員變數的唯一方法就是使用引數初始化表。例如 vs vc 不支援變長陣列 陣列長度不能是變數 我們自己定義了乙個 vla 類,用於模擬變長陣列,請看下面的...

建構函式 引數初始化列表

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

C 中建構函式初始化列表與建構函式體的區別

既然建構函式初始化列表和建構函式體內賦值都可以對成員變數賦值,那麼二者有何區別,是不是二者等效呢?建構函式可以分兩個階段進行 1 初始化階段 2 普通計算階段。計算階段也就是由函式體內所有的語句組成。不管成員是否在建構函式初始化列表中顯式初始化,類的資料成員初始化總是在初始化階段進行,初始化階段先於...