C 類成員的初始化

2021-06-28 18:03:55 字數 2675 閱讀 4972

分類: c/c++進行時

2012-04-11 10:02

14697人閱讀收藏

舉報 c++string

initialization

class

編譯器面試

1、關於建構函式

1)用建構函式確保初始化

對於乙個空類

[cpp]view plain

copy

class empty ;  

編譯器會自動宣告4個預設函式:建構函式,拷貝建構函式,賦值函式,析構函式(當然,如果不想使用自動生成的函式,就應該明確拒絕),這些生成的函式都是public且inline。建構函式對資料成員進行初始化,使用未初始化值可能導致無法預知的錯誤,所以,確保每乙個建構函式都將每乙個成員初始化。

2)為什麼建構函式不能有返回值

如果有返回值,要麼編譯器必須知道怎麼處理返回值,要麼就客戶程式設計師顯式呼叫建構函式和析構函式,這樣,還有安全性麼?

3)為什麼建構函式不能為虛函式

簡單來說,虛函式呼叫的機制,是知道介面而不知道其準確物件型別的函式,但是建立乙個物件,必須知道物件的準確型別;當乙個建構函式被呼叫時,它做的首要事情之一就是初始化它的vptr來指向vtable。

4)建構函式的乙個面試題:

[cpp]view plain

copy

#include 

using

namespace std;  

class base   

};  

class derived : public base  

void print()  

};  

int main()    

首先,是訪問許可權問題,子類中直接訪問base::i是不允許的,應該將父類的改為protected或者public(最好用protected)

其次,統計父類和子類i的和,但是通過子類建構函式沒有對父類變數進行初始化;此處編譯會找不到建構函式,因為子類呼叫建構函式會先找父類建構函式,但是沒有2個引數的,所以可以在初始化列表中呼叫父類建構函式

最後個問題,是單引數的建構函式,可能存在隱式轉換的問題,因為單引數建構函式,和拷貝建構函式形式類似,呼叫時很可能會發生隱式轉換,應加上explicit關鍵字,修改後如下(程式設計師面試寶典上只改了前2個)

[cpp]view plain

copy

#include 

using

namespace std;  

class base   

};  

class derived : public base  

void print()  

};  

int main()    

2、初始化列表

1)使用初始化列表提高效率

常用的初始化可能如下:

[cpp]view plain

copy

class student   

private :  

string name;  

int    age;  

};  

以前樓主也習慣這麼寫,可以達到預期效果,不過不是最佳做法,因為在建構函式中,是對name進行賦值,不是初始化,而string物件會先呼叫它的預設建構函式,再呼叫string類(貌似是basic_string類)的賦值建構函式;對於上例的age,因為int是內建型別,應該是賦值的時候獲得了初值。

要對成員進行初始化,而不是賦值,可以採用初始化列表(member initialization list)改寫為如下:

[cpp]view plain

copy

class student   

private :  

string name;  

int    age;  

};  

結果與上例相同,不過在初始化的時候呼叫的是string的拷貝建構函式,而上例會呼叫兩次建構函式,從效能上會有不小提公升

有的情況下,是必須使用初始化列表進行初始化的:const物件、引用物件

2)初始化列表初始順序

考慮以下**:

[cpp]view plain

copy

#include 

using

namespace std;  

class base   

base() : m_j(0), m_i(m_j) {}  

int get_i() const

int get_j() const

private:  

int m_i;  

int m_j;  

};  

int main()    

輸出為乙個隨機數和98,為什麼呢?因為對於初始化列表而言,對成員變數的初始化,是嚴格按照宣告次序,而不是在初始化列表中的順序進行初始化,如果改為賦值初始化則不會出現這個問題,當然,為了使用初始化列表,還是嚴格注意宣告順序吧,比如先宣告陣列大小,再宣告陣列這樣。

總結完畢,望有用

初始化C 類成員

問題 我的問題是關於初始化c 類成員的。我見過許多這樣的 包括在你的欄目中也見到過 csomeclass csomeclass x 0 y 1 而在別的什麼地方則寫成下面的樣子 csomeclass csomeclass x 0 y 1 我的一些程式設計師朋友說第二種方法比較好,但他們都不知道為什麼...

C 類成員的初始化

1 關於建構函式 1 用建構函式確保初始化 對於乙個空類 class empty 編譯器會自動宣告4個預設函式 建構函式,拷貝建構函式,賦值函式,析構函式 當然,如果不想使用自動生成的函式,就應該明確拒絕 這些生成的函式都是public且inline。建構函式對資料成員進行初始化,使用未初始化值可能...

C 類成員的初始化

本文 1 關於建構函式 1 用建構函式確保初始化 對於乙個空類 cpp view plain copy class empty 編譯器會自動宣告4個預設函式 建構函式,拷貝建構函式,賦值函式,析構函式 當然,如果不想使用自動生成的函式,就應該明確拒絕 這些生成的函式都是public且inline。建...