c 中類的建構函式的初始化成員列表詳解

2021-07-12 08:08:31 字數 1319 閱讀 2628

昨天傍晚在閱讀opencv的程式時看到**如下:

inline mat::mat() : size(&rows)

初始化成員就是針對建構函式而言的,建構函式執行時,需要初始化成員資料,有兩種方式初始化成員資料。下面分別介紹:

①在建構函式的函式體中,即實現中,初始類的成員資料。例如下面的**:

class point

int getx()

int gety()

};

②在建構函式的定義處以單冒號開始初始化成員列表(initializer list)來初始化成員資料,比如上面例子中的建構函式 point(int m=0,int n=0)可以重寫為:

point(int m=0,int n=0):x(m),y(n)

這樣咋一看沒有什麼不同,確實,對於上面的這種簡單列子來說,也真的沒有太大不同。

那我們為什麼要用初始化成員列表,什麼時候用初始化成員列表來初始化成員資料呢?lippman的《c++ primer》中提到在以下三種情況下需要使用初始化成員列表:

一,需要初始化的資料成員是物件的情況;

二,需要初始化const修飾的類成員;

三,需要初始化引用成員資料;

這裡我只關注第一種情況,因為第一種情況就是昨天傍晚閱讀**時遇到的情況。

看下面的一段**:

class point

point(point& p)

int getx()

int gety() };

class point3d

void print()

};

在上面的例子中,有兩個類,名字分別為 point和point3d,注意在point3d類中,即**31行定義了乙個point的類的物件,名叫m_p, point3d的建構函式名叫 point3d,這個建構函式上有需要初始化的成員i,j,k,這裡i,j,k不是以初始化成員列表的形式給出,但是單冒號後邊的m_p是乙個物件成員,所以必須用列表的形式給出,初始化成員列表實際上就是在建構函式的首行以單冒號開始的部分。

明白了以上我說的之後,再來看我昨天傍晚遇到的**:

inline mat::mat() : size(&rows)

很明顯 mat是mat類的內聯建構函式,它有物件成員需要實始化,以列表的形式給出,這個物件成員名字叫size,需要給的變數是&rows,具體來說這個名叫size的對角成員應該是包含在  initempty中的!

好了,關於的建構函式的初始化成員列表的理解分享就說到這裡!以後若有新發現再補充在這個帖子中吧!

------------------------------------------

C 建構函式初始化成員列表

1.只能在建構函式初始化列表初始化的成員變數的型別?a.const成員變數 b.引用型別的成員變數 c.static不能在初始化列表中進行初始化 d.類成員變數中有自定義型別的變數最好在初始化列表中進行初始化 2.初始化列表的順序?初始化列表的初始化順序是依據類成員變數定義的順序來決定的。3.關於s...

C 中建構函式初始化成員列表總結

1.只能在建構函式初始化列表初始化的成員變數的型別?a.const成員變數 b.引用型別的成員變數 c.static不能在初始化列表中進行初始化 d.類成員變數中有自定義型別的變數最好在初始化列表中進行初始化 2.初始化列表的順序?初始化列表的初始化順序是依據類成員變數定義的順序來決定的。3.關於s...

C 類建構函式初始化列表及初始化成員變數的誤區

建構函式初始化列表以乙個冒號開始,接著是以逗號分隔的資料成員列表,每個資料成員後面跟乙個放在括號中的初始化式。例如 cpp view plain copy class cexample 建構函式內部賦值 cexample 上面的例子中兩個建構函式的結果是一樣的。上面的建構函式 使用初始化列表的建構函...