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

2022-07-30 11:06:17 字數 2688 閱讀 2570

一、前面已經介紹了初始化列表的好處,尤其對於類型別的變數來說,會提高效率,下面來介紹必須放在初始化列表的情況(無關效率問題):

1、常量成員,因為常量(const)只能初始化不能賦值(雖說不可以賦值,但是可以通過指標的方式來訪問修改該值),所以必須放在初始化列表裡面。

2、引用型別,引用必須在定義的時候初始化,並且不能重新賦值(這是c++中引用的使用規則,這點與指標是不同的,它在執行時刻不能改變),所以也要寫在初始化列表裡面

3、沒有預設建構函式的類型別,因為使用初始化列表可以不必呼叫預設建構函式來初始化,而是直接呼叫拷貝建構函式初始化。對於這一點來說,上個筆記(建構函式之初  始化列表)中有記載。因為乙個類型別的變數在定義的時候會自動呼叫預設建構函式進行初始化, 所以當乙個類型別的成員變數沒有預設建構函式時,只能在初始化列表 中進行。且是拷貝建構函式在起作用。如下**:乙個呼叫預設建構函式和賦值建構函式,另乙個呼叫拷貝建構函式(兩種情況已經在**中標註):

1 #include2

3using

namespace

std;45

class

student1

1314 student1(const student1& t1) //

拷貝建構函式

1519

20 student1& operator = (const student1& t1) //

賦值運算子

2126

};27

class

student2

2835

//student2(student1 &t1):test(t1){}

//這樣的話僅僅呼叫拷貝建構函式,

36};

37int

main()

38

二、初始化順序初始化順序最好要按照變數在類宣告的順序一致,否則會出現下面的特殊情況

仍然拿上面的**作為例子,加入適當的**,**效果如下:

1 #include2

3using

namespace

std;45

class

student1

1213 student1(int i):b(i),a(b) //

異常順序:發現a的值為0 b的值為2 說明初始化僅僅對b有效果,對a沒有起到初始化作用

14//

student1(int i):a(i),b(a)

//正常順序:發現a = b = 2 說明兩個變數都是初始化了的

1516 student1() //

無參建構函式

1720

21 student1(const student1& t1) //

拷貝建構函式

2226

27 student1& operator = (const student1& t1) //

賦值運算子

2833

34};

35class

student2

3643

//student2(student1 &t1):test(t1){}

44};

45int

main()

46

兩種不同的初始化方法結果如下:

異常初始化順序:

正常初始化順序:

由上面的例子可知,初始化列表的順序要跟你在類宣告的順序要一致。否則像上面的那種特殊情況,有些變數就不會被初始化。經過測試發現,類中變數為下面的情況也是能夠正常初始化的:也就是說,只要成員變數的初始化不依賴其他成員變數,即使順序不同也能正確的初始化。

1

inta;

2intb;3

intc;

4 student1(int

i):b(i),a(i),c(i){}

5main:

6 student1 a(2

);

7 a.fprint();

結果:

1

inta;

2intb;3

intc;

4 student1(int i,int j,int

k):b(i),a(j),c(k){}

5main:

6 student1 a(2,3,4

);7 a.fprint();

結果:

比如

「反覆研究好幾遍,我才發現關於 cmake 變數還可以這樣理解!」

繼承之初始化順序

1.繼承之初始化順序 1 初始化父類在初始化子類 2 先執行初始化物件中的屬性,在執行構造方法中的初始化 父類物件 屬性初始化 構造方法 更改屬性值 v 子類物件 屬性初始化 構造方法 更改屬性值 demo 父類 public class animal 子類 class 子類 extends 父類 ...

初始化 1 預設初始化 列表初始化

初始化的基本概念 事實 初始化和賦值是兩個完全不同的操作。初始化,是建立變數時賦予其乙個初始值。賦值,是把物件的當前值擦除,用乙個新值代替。列表初始化 p39 作為c 11新標準的一部分,用花括號 來初始化變數得到了全面應用。出於某些原因,這種初始化的方式叫做列表初始化。現在,無論是初始化物件還是某...

關於初始化及初始化順序

首先,類的成員變數會被自動初始化,並且會在構造器被呼叫前發生,如下 public class testinitialization public static void main string args 如下 主類 public class staticinitialization 呼叫main之前...