Guru of the week:#19 自動型別轉換. (轉)

worldblog發表於2007-12-04
Guru of the week:#19 自動型別轉換. (轉)[@more@]

/*此文是譯者出於自娛翻譯的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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章