成員初始化列表 初始化同賦值的區別

2021-06-21 10:24:39 字數 2700 閱讀 9378

成員初始化列表 初始化同賦值的區別

1.我們可以認為建構函式的執行過程被分成兩個階段,隱式或顯式初始化階段以及一般的計算階段。計算階段由建構函式體內的所有語句構成,在計算階段中資料成員的設定被認為是賦值而不是初始化。

初始化階段可以是顯式的或隱式的,取決於是否存在成員初始化表。隱式初始化階段按照宣告的順序,依次呼叫所有基類的預設建構函式,然後是所有成員類物件的預設建構函式。

例如當我們寫如下** 

inline account:: 

account()

則初始化階段是隱式的在建構函式體被執行之前先呼叫與_name 相關聯的預設string建構函式,這意味著把空串賦給_name 的賦值操作是沒有必要的。

2.   對於非類資料成員的初始化或賦值,除了兩個例外,兩者在結果和效能上都是等價的。即,更受歡迎的實現是用成員切始化表

//  更受歡迎的初始化風格 

inline account::

account() : _balanae( 0.0 ), _acct_nmbr( 0 )

兩個例外是指任何型別的const和引用資料成員。const和引用資料成員也必須是在成員初始化表中被初始化,否則就會產生編譯時刻錯誤。例如下列建構函式的實現將導致編譯時刻錯誤 

class constref ; 

constref::

constref( int ii )

當建構函式體開始執行時所有const和引用的初始化必須都已經發生。

3.    每個成員在成員初始化表中只能出現一次,初始化的順序不是由名字在初始化表中的順序決定,而是由成員在類中被宣告的順序決定的。例如給出下面的account資料成員的宣告順序:

class account 

;

下面的預設建構函式 

inline account:: 

account() : _name( string() ), _balance( 0.0 ), _acct_nmbr( 0 )

{}

的初始化順序為acct_nmbr _balance,然後是_name,但是在初始化表中出現或者在被隱式初始化的成員類物件中的成員總是在建構函式體內成員的賦值之前被初始化.

例如在下面的建構函式中 

inline account:: 

account( const char *name, double bal )

: _name( name ), _balance( bal )

初始化的順序是_balance _name 然後是_acct_nmbr

4.用乙個類物件初始化該類另乙個物件發生在下列程式情況下 

<1> 用乙個類物件顯式地初始化另乙個類物件例如 

account newacct( oldacct );

<2> 把乙個類物件作為實參傳遞給乙個函式例如 

extern bool cash_on_hand( account acct ); 

if ( cash_on_hand( oldacct ))

// ...

把乙個類物件作為乙個函式的返回值傳遞回來例如 

extern account 

consolidate_accts( const vector< account >& )

<3> 非空順序容器型別的定義例如 

//  五個 string  拷貝建構函式被呼叫 

vector < string > svec( 5 );

在本例中用string 預設建構函式建立乙個臨時物件然後通過string 拷貝建構函式 

該臨時物件被依次拷貝到vector 的五個元素中  

<4> 把乙個類物件插入到乙個容器型別中例如 

svec.push_back( string( "pooh" )); 

--------以上摘自《c++ primer》

看下面的例子: ---摘自《高質量c++程式設計指南》

class a ;  

class b

;

示例 a:

b::b(const a &a) 

: m_a(a)

示例 b:

b::b(const a &a) 

示例 b:示例 a 中,類 b 的建構函式在其初始化表裡呼叫了類 a 的拷貝建構函式,從而

將成員物件 m_a 初始化。 

示例 b 中,類 b 的建構函式在函式體內用賦值的方式將成員物件 m_a 初始化。

我們看到的只是一條賦值語句,但實際上 b 的建構函式幹了兩件事:先暗地裡建立 m_a

物件(呼叫了 a 的無引數建構函式),再呼叫類 a 的賦值函式,將引數 a 賦給 m_a。 

對於類成員,若它定義了帶引數的建構函式後,而沒有預設建構函式,那麼該類物件就只能在成員初始化列表中進行初始化。

初始化列表成員變數的初始化

對於以下程式 include using namespace std class base base b 0 a b int get a int get b int main 本想得到的結果是a,b都為90。但是實際結果卻是 4273046 90process returned 0 0x0 exec...

成員初始化列表

類物件的構造順序是這樣的 1.分配記憶體,呼叫建構函式時,隱式 顯示的初始化各資料成員 初始化階段可以是顯式的或隱式的,取決於是否存在成員初始化表。隱式初始化階段按照宣告的順序依次呼叫所有基類的預設建構函式,然後是所有成員類物件的預設建構函式。2.進入建構函式後在建構函式中執行一般計算 計算階段由建...

成員初始化列表

任乙個物件的建立都要呼叫建構函式,而在建構函式中一般要給物件屬性賦值。成員初始化列表 member initialize list 是建構函式中特有的語法,用以簡化對物件屬性的賦值。其用法如下 class myclass 以上 相當於 class myclass 用成員初始化列表的語法來表述很顯然 ...