c++——初始化列表


多個對象構造和析構

1對象初始化列表 

1)對象初始化列表出現原因

1.必須這樣做:

如果我們有一個類成員,它本身是一個類或者是一個結構,而且這個成員它只有一個帶參數的構造函數,沒有默認構造函數。這時要對這個類成員進行初始化,就必須調用這個類成員的帶參數的構造函數,

如果沒有初始化列表,那么他將無法完成第一步,就會報錯。

 

2、類成員中若有const修飾,必須在對象初始化的時候,給const int m 賦值

當類成員中含有一個const對象時,或者是一個引用時,他們也必須要通過成員初始化列表進行初始化,

因為這兩種對象要在聲明后馬上初始化,而在構造函數中,做的是對他們的賦值,這樣是不被允許的。

2)C++中提供初始化列表對成員變量進行初始化

語法規則

Constructor::Contructor() : m1(v1), m2(v1,v2), m3(v3)

{

    // some other assignment operation

}

3)注意概念

初始化:被初始化的對象正在創建

賦值:被賦值的對象已經存在

 

4)注意:

成員變量的初始化順序與聲明的順序相關,與在初始化列表中的順序無關

初始化列表先於構造函數的函數體執行

 1 #include <iostream>
 2 using namespace std;
 3 
 4 class A
 5 {
 6 public:
 7     A(int _a)
 8     {
 9         a = _a;
10         cout << "構造函數" << "a" << a << endl;
11     }
12 
13     ~A()
14     {
15         cout << "析構函數" << "a" << a << endl;
16     }
17 
18 protected:
19 private:
20     int a;
21 };
22 
23 
24 //1 構造函數的初始化列表  解決: 在B類中 組合了一個 A類對象 (A類設計了構造函數)
25 //根據構造函數的調用規則 設計A的構造函數, 必須要用;沒有機會初始化A
26 //新的語法  Constructor::Contructor() : m1(v1), m2(v1,v2), m3(v3)
27 class B
28 {
29 public:
30     B(int _b1, int _b2) : a1(1), a2(2), c(0)
31     {
32 
33     }
34 
35     B(int _b1, int _b2, int m, int n) : a1(m), a2(n), c(0)
36     {
37         b1 = _b1;
38         b2 = _b2;
39         cout <<"B的構造函數"<<endl;
40     }
41     ~B()
42     {
43         cout<<"B的析構函數" <<endl;
44     }
45 
46 protected:
47 private:
48     int b1;
49     int b2;
50     A a2;
51     A a1;
52     const int c;
53 };
54 
55 
56 //2 先執行 被組合對象的構造函數 
57 //如果組合對象有多個,按照定義順序, 而不是按照初始化列表的順序
58 
59 //析構函數 : 和構造函數的調用順序相反
60 
61 //3 被組合對象的構造順序 與定義順序有關系 ,與初始化列表的順序沒有關系.
62 //4 初始化列表 用來 給const 屬性賦值 
63 void obj10play()
64 {
65     
66     //A a1(10);
67     //B ojbB(1, 2);
68 
69     //1參數傳遞 
70     B ojbB2(1, 2,3, 4);
71 
72     //2 調用順序
73     
74     return ;
75 }
76 
77 void main100()
78 {
79     obj10play();
80     system("pause");
81 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM