作者babyghost (Python語法真精簡 Orz)
看板C_and_CPP
標題Re: [問題] 建構元初始化
時間Thu Feb 16 00:45:54 2006
※ 引述《justinC (無)》之銘言:
: 請問用串列初始化
: 跟 在建構元內寫指定來初始化兩個差異性在哪 各有啥好處
我聽過的翻譯是叫 "初始化串列" " initial list "
差在用 initial list 時, object 會呼叫 constructor 會比較快.
在 {} 裡叫用 operator = 會比較慢一點, 你多呼叫了一個函式.
以下為例 :
class Student
{
public:
// version1 : use initial list.
Student( const string& str )
: name( str )
// just call copy constructor.
{}
// version2 : non-use initial list.
Student( const string& str )
{
// compiler 會偷偷插入 name::string()呼叫預設建構子初始化
name = str;
// call string::operator=.
}
string name;
};
note: version1 和 version2 不可能同時存在. (這裡是example XD)
version1:
name 呼叫 class string 的建構子. <= 只呼叫一次.
version2:
compiler 會在建構子偷偷插入 name::string() 呼叫預設建構子.
接下來 name = str 會呼叫 class string 的 operator = (...).
=> 呼叫二次.
note:
若 string operator = 內部實作是用動態配置記憶體的話,
你還要先 delete 掉 buffer 再重新 allocate 夠大的 buffer
然後再塞 data.
不管 operator = 實作再快, 都逃不了 compiler 偷偷塞的
預設建構子呼叫, 比 initial list 就是多了一次呼叫.
好處: (個人意見 XD)
initial list : 比較快.
一般寫法 : 比較慢.
壞處:
initial list : 寫時比較麻煩(其實也還好 )
一般寫法 : 易讀.
一般來說用 initial list 都比較快. 不過我想就一般基本型別應該沒啥差
差的應該都是 user defined data.
: 我只知道用串列可以初始化const 的變數
嗯, 基本上
const type variable_name 的
都一定要用 initial list 初始化.
: 如果指定可以 配置動態記憶體
: 想問各個優缺點 謝謝
這個我完全看不懂你在寫啥 XD
有錯請指正 :)
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 210.192.143.24
1F:→ babyghost:寫錯,編譯器偷塞的應該是 name.string::string(). 02/16 00:47
2F:→ babyghost:C++ Primer or efficient C++ Performance Programming 02/16 00:49
3F:→ babyghost:Techniques 的第五章 都可以參考一下 02/16 00:49
4F:推 justinC:好詳細 我最後指的是 如果 char *字串 就要 allocate空間 02/16 01:06
5F:推 cplusplus:可以再加一點壞處 list無法事先作參數檢查或額外處理 02/16 01:09
6F:→ cplusplus:另外如果是基本型別 兩種效率相同 02/16 01:10
7F:→ cplusplus:list好處還有~ const成員的唯一初始化地方... 02/16 01:11
8F:推 godfat:我覺得參數檢查應該放在外面說,放在裡面像在測試 02/16 01:19
9F:→ cplusplus:沒錯誤當然最好 可是使用者通常不會這麼乖orz 保險一點 02/16 01:23
10F:→ cplusplus:還是做錯誤檢查比較好 可以做安全機制 02/16 01:24
11F:推 godfat:我的意思是在傳給 c'tor 前先檢查,不要放在 c'tor 內檢查 02/16 01:27
12F:→ godfat:有的時候可以確定輸入必為正確,放在 c'tor 內影響效率 02/16 01:27
13F:→ godfat:當然我想這還是要看情況就是了,沒什麼絕對的 02/16 01:28
14F:推 UNARYvvv:member initialization list 02/16 19:31