今天學了乙個知識點,感覺還挺重要的,就是當乙個類中的某個資料成員同時擁有就地初始化、建構函式初始化列表和建構函式函式體裡的賦值,那麼它會先執行哪個?最後生效的又是哪個呢?
根據老師的講解,資料成員的初始化次序依次為:
就地初始化 > 建構函式的初始化列表 >建構函式裡的賦值(嚴格意義上不能成為初始化)
而當三種初始化方式都有時,構造函的函式體裡的賦值肯定執行,並且生效,但是就地初始化和建構函式初始化列表的執**況是怎樣呢?寫段**測試一下
#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資料成員必須在建構函式的初始化...