c 中類的資料成員初始化次序

2021-09-25 17:26:09 字數 1017 閱讀 5914

今天學了乙個知識點,感覺還挺重要的,就是當乙個類中的某個資料成員同時擁有就地初始化、建構函式初始化列表和建構函式函式體裡的賦值,那麼它會先執行哪個?最後生效的又是哪個呢?

根據老師的講解,資料成員的初始化次序依次為:

就地初始化 > 建構函式的初始化列表 >建構函式裡的賦值(嚴格意義上不能成為初始化)

而當三種初始化方式都有時,構造函的函式體裡的賦值肯定執行,並且生效,但是就地初始化和建構函式初始化列表的執**況是怎樣呢?寫段**測試一下

#include#includeusing namespace std;

int n = 0;

class stu;

stu(int id):id(id)

int getid()

~stu()

};int main(); //呼叫無參構造

cout << "n = " << n << ",id = " << s1.getid()<< endl;

stu s2;

cout << "n = " << n << ",id = " << s2.getid()<< endl;

return 0;

}

執行結果為:

0n = 1,id = 1

n = 1,id = 10

可以看出,當呼叫無參構造時,id執行了就地初始化,而當調有參建構函式時,id沒有執行就地初始化,而是直接執行了建構函式初始化列表。

所以當乙個資料成員同時擁有就地初始化和初始化列表時,它會忽略就地初始化而執行建構函式初始化列表。

如果到**中的有參建構函式的函式體中加上this->id = 20;,執行結果會變為:

0n = 1,id = 1

n = 1,id = 20

可以看到賦值把初始化列表給id初始化的值覆蓋掉了,這裡在情理之中。

中國大學mooc中c++程式設計(物件導向高階)中4.2 成員的初始化次序

成員初始化次序

include using namespace std class base base int i m i m j m j i int get i int get j int main 結果 偽隨機數,98 建構函式初始化列表僅指定用於初始化成員的值,並不指定這些初始化執行的順序,成員初始化的次序就...

c 建構函式初始化列表中成員初始化的次序性

上 include using namespace std class a void print val private inti intj int main int argc char ar 結果 究其因 類中成員變數的宣告次序為先i後j,在初始化列表中初始化時,先j後i。但是程式執行時,初始化列...

C 類資料成員的初始化

c 為類中提供類成員的初始化列表 類物件的構造順序是這樣的 1.分配記憶體,呼叫建構函式時,隱式 顯示的初始化各資料成員 2.進入建構函式後在建構函式中執行一般計算 1.類裡面的任何成員變數在定義時是不能初始化的。2.一般的資料成員可以在建構函式中初始化。3.const資料成員必須在建構函式的初始化...