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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Java資料型別自動轉換(++ ,+=)Java資料型別
- java基本資料型別與自動轉換Java資料型別
- 型別轉換型別
- C++ 動態型別轉換C++型別
- java- 型別-轉換:基本型別以及包裝型別的轉換Java型別
- js型別轉換JS型別
- 型別轉換(cast)型別AST
- Convert型別轉換型別
- 資料型別,型別轉換資料型別
- 自學PHP筆記 (三) 型別轉換PHP筆記型別
- 自學PHP筆記(三) 型別轉換PHP筆記型別
- 自學java筆記I 基本型別+轉義字元+資料型別的轉換Java筆記字元資料型別
- JNI常用型別轉換型別
- 容器,型別轉換。List。型別
- c++ 型別轉換C++型別
- interface{} 型別的轉換型別
- 型別轉換注意點型別
- 變數型別轉換變數型別
- Spring型別轉換(Converter)Spring型別
- 資料型別轉換資料型別
- golang的型別轉換Golang型別
- 型別轉換運算子型別
- C# 型別轉換C#型別
- 型別轉換工具類型別
- 強制型別轉換型別
- go interface{}型別轉換Go型別
- c語言中的資料型別的自動轉換原則C語言資料型別
- jsp頁面number型別自動轉為String型別JS型別
- 第二天:識別符號、賦值、資料型別、格式符、常量、自動轉換、強制轉換。符號賦值資料型別
- Java資料型別及型別轉換Java資料型別
- 第11章 使用類——型別轉換(二)將自定義型別轉換為內建型別型別
- JavaScript隱式型別轉換JavaScript型別
- 強制型別轉換之(==)型別
- JavaScript 資料型別轉換JavaScript資料型別
- 型別轉換(int 和 String)型別
- Pytorch變數型別轉換PyTorch變數型別
- javascript資料型別轉換JavaScript資料型別
- 【Java】資料型別轉換Java資料型別
- go-常用型別轉換Go型別