1. 程式人生 > >必須要用初始化列表的幾種情況

必須要用初始化列表的幾種情況

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;
        int p;
        
int &j; }; int main(int argc ,char **argv) { int pp = 45; A b(pp); b.print_val(); }
複製程式碼

究其因

const物件或引用只能初始化但是不能賦值。建構函式的函式體內只能做賦值而不是初始化,因此初始化const物件或引用的唯一機會是建構函式函式體之前的初始化列表中。

從無到有叫初始化,初始化(呼叫拷貝建構函式)建立了新物件;賦值(呼叫賦值操作符)沒有建立新物件,而是對已有的物件賦值。

3. 類成員為沒有預設建構函式的類型別

複製程式碼
#include <iostream>
using
namespace std; class Base { public: Base(int a) : val(a) {} private: int val; }; class A { public: A(int v) : p(v), b(v) {} void print_val() { cout << "hello:" << p << endl;} private: int p;
Base b; };
int main(int argc ,char
**argv) { int pp = 45; A b(pp); b.print_val(); }
複製程式碼

原因同樣是建立物件時,要初始類成員的每一個成員(如果沒有在初始化列表裡面,編譯器會自動使用它的預設的建構函式進行初始化,

但是它沒有預設建構函式,所以會編譯報錯,所以沒有預設建構函式的成員變數需要使用初始化列表進行初始化)

4. 如果類存在繼承關係,派生類必須在其初始化列表中呼叫基類的建構函式

複製程式碼
#include <iostream>
using namespace std;

class Base
{
    public:
        Base(int a) : val(a) {}
    private:
        int val;
};

class A : public Base
{
    public:
        A(int v) : p(v), Base(v) {}
        void print_val() { cout << "hello:" << p << endl;}
    private:
        int p;
};

int main(int argc ,char **argv)
{
    int pp = 45;
    A b(pp);
    b.print_val();
}
複製程式碼