初始化列表和宣告順序之間的關係

2021-08-31 14:13:02 字數 1348 閱讀 5916

[align=center][size=large][b]初始化列表和宣告的順序之間的關係[/b][/size][/align]

類中資料成員的宣告順序和初始化順序之間的關係?

在類中的宣告順序是不是一定和初始化順序相一致,不一致會出現什麼結果,為什麼要一致?

類的資料成員的初始化順序是按照類內資料成員的宣告順序進行初始化的,這樣就可以減少不必要的開銷,這樣的話類就不必要為每乙個物件進行跟蹤初始化資料成員,只需要按照類中的宣告順序進行初始化就可以了。

如果允許上面的情況(即,成員按它們在初始化列表上出現的順序被初始化)發生,編譯器就要為每乙個物件跟蹤其成員初始化的順序,以保證它們的析構函式以正確的順序被呼叫。這會帶來昂貴的開銷。所以,為了避免這一開銷,同一種型別的所有物件在建立(構造)和摧毀(析構)過程中對成員的處理順序都是相同的,而不管成員在初始化列表中的順序如何。

另外,基類資料成員總是在派生類資料成員之前被初始化,所以使用繼承時,要把基類的初始化列在成員初始化列表的最前面。

看下面的例子:

#include

#include

using namespace std;

template

class array ;

template

void array::print() const

template

array::array(int lowbound, int highbound)

: size(highbound - lowbound + 1),

lbound(lowbound), hbound(highbound),data(size)

{}int main()

這段**中的初始化列表為:: size(highbound - lowbound + 1),lbound(lowbound), hbound(highbound),data(size)

宣告的順序為: vectordata; // 陣列資料儲存在vector物件中

size_t size; // 陣列中元素的數量

int lbound, hbound; // 下限,上限

編輯器會按照宣告順序進行初始化,那麼首先初始化vectordata; 由於vectordata; 的初始化是data(size),而size有沒有被初始化,所以這段**是有隱患的。

所以宣告時應該這樣宣告:

size_t size; // 陣列中元素的數量

int lbound, hbound; // 下限,上限

vectordata; // 陣列資料儲存在vector物件中

記住:初始化列表中成員列出的順序和成員在類內宣告的順序一致。

java陣列的初始化和宣告

陣列宣告 對於陣列的宣告其實都沒多大問題,推薦的寫法是使用 資料型別 陣列名稱的方式,因為這種方式可以很清楚的表明這是某一種型別的陣列。例如,宣告一整數型別的陣列。int a 陣列初始化 其實出現問題最多的就是陣列的初始化。陣列的初始化分為三種方式,再遇到初始話的時候,總是會搞不清楚。根據我個人的理...

筆記 初始化列表之初始化順序

一 前面已經介紹了初始化列表的好處,尤其對於類型別的變數來說,會提高效率,下面來介紹必須放在初始化列表的情況 無關效率問題 1 常量成員,因為常量 const 只能初始化不能賦值 雖說不可以賦值,但是可以通過指標的方式來訪問修改該值 所以必須放在初始化列表裡面。2 引用型別,引用必須在定義的時候初始...

C 陣列的概念和宣告 初始化

陣列是乙個儲存相同型別元素的固定大小的有順序的集合。陣列是用來儲存資料的集合,通常認為陣列是乙個同一型別變數的集合。陣列也是一種資料型別,陣列是引用型別 1.1陣列的型別 一維陣列 二維陣列 多維陣列 交錯陣列 1.2簡單陣列 1.2.1陣列的宣告 資料型別 陣列名稱 通過陣列的宣告,明確這個陣列中...