Guru of the Week 条款01: 变量的初始化
GotW #01 Variable Initialization
著者:Herb Sutter?????
翻譯:kingofark
[聲明]:本文內容取自www.gotw.ca網站上的Guru of the Week欄目,其著作權歸原著者本人所有。譯者kingofark在未經原著者本人同意的情況下翻譯本文。本翻譯內容僅供自學和參考用,請所有閱讀過本文的人不要擅自轉載、傳播本翻譯內容;下載本翻譯內容的人請在閱讀瀏覽后,立即刪除其備份。譯者kingofark對違反上述兩條原則的人不負任何責任。特此聲明。
Revision 1.0
Guru of the Week 條款01: 變量的初始化
難度:4 / 10
(想想看,有多少種將變量初始化的方法? 千萬要注意那些看上去很像“變量初始化”的東西。)
?
[問題]
下列四條語句有什么區別嗎?
??? SomeType t = u;
??? SomeType t(u);
??? SomeType t();
??? SomeType t;
[解答]
我們按從下往上的順序逐個考察四條語句:
*?? SomeType t;
??? 變量t被缺省構造函數SomeType::SomeType()初始化。
*?? SomeType t();
??? 這是一個騙局,因為這條語句看上去很像一個變量聲明,而實際上卻是一個函數聲明;這個函數t沒有參數并且返回類型為SomeType。
*?? SomeType t(u);
??? 這是直接初始化。變量t通過構造函數SomeType::SomeType(u)被初始化。
*??SomeType t = u;
??? 這是拷貝初始化。變量t通過SomeType的拷貝構造函數(Copy Constructor)被初始化。(注意,這條語句雖然含有“=”,但仍然是一個初始化操作,而不是一個賦值操作,因為在這里,允許使用'='只是為了可以沿用C語言的語法,operator=是不會被調用的。)
????[語義學參考]:如果u恰好也是SomeType類型,那么這條語句與“SomeType t(u);”是等同的,將調用SomeType的拷貝構造函數(Copy Constructor)。如果u是SomeType以外的其它類型,那么這條語句與“SomeType t(SomeType(u))”是等同的。可以看到,在語句“SomeType t(SomeType(u))”里,u被轉換成一個臨時的SomeType對象,而t則是由此拷貝構造出來的。
??? [注意]:在這種情況下,編譯器通常可以(但不是必須要)對其進行優化,適當的處理拷貝構造(Copy Construction)操作(一般是省略掉拷貝構造過程)。如果進行了優化,則一定要保證拷貝構造函數(Copy Constructor)的可達性。
?
?? [學習指導]:?建議總是使用“SomeType t(u)”的形式, 一來是因為只要可以用“SomeType t = u”的地方也同樣可以它;二來是因為它還有一些其它的優點,比如支持多個參數等。
轉載于:https://www.cnblogs.com/snben/archive/2012/08/27/2658939.html
總結
以上是生活随笔為你收集整理的Guru of the Week 条款01: 变量的初始化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: checkedListBox使用例子
- 下一篇: 调用GOOGLE语音