首頁>技術>

為什麼要有初始化列表,初始化列表的作用是什麼呢?哪些情況下必須要用初始化列表,這應該是令c++初學者頭疼的問題了?

下面就簡單介紹一下:

首先什麼初始化列表呢,我們先理解一下這個概念,c++物件的建立首先是開闢記憶體,然後呼叫建構函式,這裡呼叫建構函式就分為隱式初始化和顯示初始化,顯示初始化的就是直接呼叫建構函式或複製建構函式,函式寫什麼樣,就怎麼樣呼叫。

而隱式的就是不是函式呼叫的方式,但是後面操作的依然是建構函式或複製建構函式,只是看起來不明顯容而已。

以下幾種情況必須在建構函式的初始化列表中:

1、類的const常量2、類的引用型別成員3、沒有預設建構函式的型別成員4、如果類存在繼承關係,派生類必須在其初始化列表中呼叫基類的建構函式

詳細情況如下:

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();}

備註:

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

2、從無到有叫初始化,初始化(呼叫複製建構函式)建立了新物件;賦值(呼叫賦值運算子)沒有建立新物件,而是對已有的物件賦值。

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();}

9
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 什麼是網站伺服器-網站託管服務