【轉】構造函數中,成員變量一定要通過初始化列表來初始化的幾種情況


 

1、類成員為const類型

2、類成員為引用類型

#include <iostream>
using namespace std;

class A
{
public:
    A(int &v) : i(v), p(v), j(v) {}
    void print_val() { cout << "hello:" << i << "  " << j << endl; }
private:
    const int i;//類成員為const類型
    int p;
    int &j;//類成員為引用類型
};

int main(int argc, char **argv)
{
    int pp = 45;
    A b(pp);
    b.print_val();
}

 

運行結果:

 

究其因

const對象或引用只能初始化但是不能賦值。構造函數的函數體內只能賦值而不是初始化,因此初始化const對象或引用的唯一機會是構造函數函數體之前的初始化列表中。

從無到有叫初始化,初始化(調用拷貝構造函數)創建了新對象;賦值(調用賦值操作符)沒有創建新對象,而是對已有的對象賦值

 

3、類成員為沒有默認構造函數的類類型

 1 #include <iostream>
 2 using namespace std;
 3 
 4 class Base
 5 {
 6 public:
 7     Base(int a) : val(a) {}
 8 private:
 9     int val;
10 };
11 
12 class A
13 {
14 public:
15     A(int v) : p(v), b(v) {}
16     void print_val() { cout << "hello:" << p << endl; }
17 private:
18     int p;
19     Base b;//類成員為沒有默認構造函數的類
20 };
21 
22 int main(int argc, char **argv)
23 {
24     int pp = 45;
25     A b(pp);
26     b.print_val();
27 }

運行結果:

原因同樣是創建對象時,要初始類成員的每一個成員

 

4、如果類存在繼承關系,派生類必須在其初始化列表中調用基類的構造函數

 1 #include <iostream>
 2 using namespace std;
 3 
 4 class Base
 5 {
 6 public:
 7     Base(int a) : val(a) {}
 8 private:
 9     int val;
10 };
11 
12 class A : public Base
13 {
14 public:
15     A(int v) : p(v), Base(v) {}//類A繼承自類Base,需在其初始化列表中調用Base的構造函數
16     void print_val() { cout << "hello:" << p << endl; }
17 private:
18     int p;
19 };
20 
21 int main(int argc, char **argv)
22 {
23     int pp = 45;
24     A b(pp);
25     b.print_val();
26 }

 運行結果:

 

以上。


免責聲明!

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



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