Guru of the week:#19 自動型別轉換. (轉)
/*此文是譯者出於自娛翻譯的GotW(Guru of the Week)系列文章的一篇,原文的版權是屬於Hub Sutter(著名的C++專家,《Exceptional C++》的作者)。此文的翻譯沒有徵得原作者的同意,只供學習討論。——譯者:黃森堂*/
#19 自動型別轉換.
難度:4/10
自動型別轉換是從一種型別轉換到別外一種型別,這是極端的轉換,本期包括典型的例子來舉例說明為什麼它是極端危險的。
問題:
標準C++裡的string沒有自動轉換成const char*,它應該有嗎?
* * * * *
背景:它經常能像C型別const char*一樣有新效去存取字串,的確,string的內部成員c_str()就僅僅做這些,它返回const char*,這兒有不同的客戶端程式碼:
string s1("hello"), s2("world"); strcmp( s1, s2 ); // 1 (error) strcmp( s1.c_str(), s2.c_str() ) // 2 (ok)
#1的確是很細微的地方,但#1是錯的,因為strcmp需要兩個指標且它們都沒有自動從string轉換到const char*,#2是對的,但始終可以寫,因為我們明確地c_str(),如果我們僅僅寫#1不是最好的嗎?
解決方法:
標準C++裡的string沒有自動轉換成const char*,它應該有嗎?
不應該有!,這需要好的理由,它始終有好辦法防止自動型別轉換中的寫入,要麼以轉換運算子或者以單個引數的隱式構造。
有兩個主要理由來說明轉換操作是不的:
a)它們會引起過載衝突;
b)它們會讓錯誤的程式碼編譯成功。
如果string允許自動轉換成const char*,在任何地方的呼叫將進行隱式轉換,且讓認為這是對的,為什麼這個方法將讓你處理一些微妙的轉換問題 -- 相同的一點,你進入到當你沒有明確地進行轉換構造的時候,它成為也容易寫在右邊的程式碼,而在實際上是不能在右邊且將會失敗,但巧合是編譯時做了一些跟我們想象的完全不同.
這裡有個簡單的示例:
string s1, s2, s3; s1 = s2 - s3; // s, probably meant "+"
減法是無意見且是錯誤的,如果string已經明確轉換成const char*,無論如何,這段程式碼被編譯了,因為編譯器預設轉換成兩個string成const char*並減去那指標.
總結:
- 防止轉換操作進行寫(Meyers96: 24-31; Murray93: 38, 41-43; Lakos96: 646-650)
註解:
1.我們應該注視在通常的明確轉換操作的問題,但那兒還有其它原因,為什麼string類不允許自動轉換成const char*,那兒有少數引用的其它討論:
Koenig97: 290-292
Stroustrup94 (D&E): 83
可參考:
Koenig97 Andrew Koenig. "Ruminations on C++" Addison-Wesley, 1997 Lakos96 John Lakos. "Large-Scale C++ Software Design" Addison-Wesley, 1996 Meyers96 tt Meyers. "More Effective C++" Addison-Wesley, 1996 Murray93 Robert Murray. "C++ Strategies and Tactics" Addison-Wesley, 1993 Stroustrup94 Bjarne Stroustrup. (or D&E) "The Design and Evolution of C++" Addison-Wesley, 1994
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-987948/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Guru of the Week 條款19:自動轉換 (轉)
- Guru of the week:#17 型別對映. (轉)型別
- C++ articles:Guru of the Week #1 (轉)C++
- Guru of the week:#18 迭代指標. (轉)指標
- Guru of the Week 條款27:轉呼叫函式 (轉)函式
- Java資料型別自動轉換(++ ,+=)Java資料型別
- PostgreSQL自定義自動型別轉換(CAST)SQL型別AST
- php之資料型別自動轉換PHP資料型別
- C++ articles:Guru of the Week #4 -- Class Mechantics (轉)C++
- C語言中資料型別的自動型別轉換C語言資料型別
- java基本資料型別與自動轉換Java資料型別
- JS直譯器之自動型別轉換:[]==![]JS型別
- Guru of the Week 條款28:“Fast Pimpl”技術 (轉)AST
- Guru of The week #20 程式碼的複雜性 Ⅰ. (轉)
- java型別轉換與強制型別轉換(轉)Java型別
- PHP 型別轉換&&型別強制轉換PHP型別
- C++ articles:Guru of the Week #3:使用標準庫 (轉)C++
- Guru of the Week 條款09:記憶體管理(上篇) (轉)記憶體
- Guru of the Week 條款10:記憶體管理(下篇) (轉)記憶體
- Guru of the Week 條款24:編譯級防火牆 (轉)編譯防火牆
- Guru of the Week 條款30附錄:介面原則 (轉)
- 型別轉換型別
- Guru of the Week 條款05:覆寫虛擬函式 (轉)函式
- Guru of the Week 條款13:物件導向程式設計 (轉)物件程式設計
- Guru of the Week #5:虛擬函式的重新定義 (轉)函式
- java- 型別-轉換:基本型別以及包裝型別的轉換Java型別
- c語言中資料型別的自動轉換原則C語言資料型別
- 資料型別,型別轉換資料型別
- js型別轉換JS型別
- 字元型別轉換字元型別
- 3.2 型別轉換型別
- JavaScript 型別轉換JavaScript型別
- Golang型別轉換Golang型別
- Guru of the Week 條款07:編譯期的依賴性 (轉)編譯
- Guru of the Week 條款11:物件等同(Object Identity)問題 (轉)物件ObjectIDE
- Guru of the Week 條款14:類之間的關係(上篇) (轉)
- Guru of the Week 條款15:類之間的關係(下篇) (轉)
- C++中的向上型別轉換和向下型別轉換C++型別