2014-01-29 84 views
7

爲什麼頭文件<string>stodstof,stoull)的那些C++ 11新函數不是string類的成員函數?爲什麼C++ 11字符串新函數(stod,stof)不是字符串類的成員函數?

是不是更多的C++寫入mystring.stod(...)而不是stod(mystring,...)

+8

他們並不需要是,和'的std :: string'已經有太多的成員函數。見[巨石「無毛的」GOTW](http://www.gotw.ca/gotw/084.htm)。 – juanchopanza

+2

這本來是很好,如果'stod'是可以採取任何'Sequence'對象,而不是隻是'的std :: string' – Siler

+1

的std :: string已經是[A類的整體(HTTP模板:// WWW .gotw.ca/gotw/084.htm),它不需要更多的成員函數。 –

回答

22

很多人都很驚訝,但是C++是而不是一種面向對象的語言(與Java或C#不同)。

C++是一種多範式語言,因此儘可能使用最佳工具。在這種情況下,自由功能是正確的工具。

準則不想非成員非朋友函數成員函數(從高效C++,第23項)

原因:一個成員函數或朋友功能有權訪問類的內部,而非會員非朋友功能不會;因此使用非會員非朋友功能增加封裝

例外:當成員函數或朋友函數提供了顯着的優勢(如性能)時,儘管存在額外的耦合,但值得考慮。例如,儘管std::find工作得很好,但關聯容器(例如std::set)提供的成員函數std::set::find在O(log N)而不是O(N)中工作。

+1

+1異常部分 – Guillaume07

+3

'std :: basic_string' ... – pmr

+0

@pmr:是的,'std :: basic_string'和所有的IO流是預先存在的標準化的恐龍;實際上,'string'的原始版本完全按照索引來定義,並且在標準化過程中,所有迭代器重載都被添加以形成它的序列...但是爲了兼容性保留了前面的方法。 –

1

其實他們是一些實用功能,他們不需要在主類。類似的實用程序函數,如atoi,atof在stdlib.h中定義(但用於char *),它們也是獨立函數。

3

其根本原因是他們不屬於那裏。他們 與字符串沒有任何關係。停下來想一下 。用戶定義的類型應遵循與 內置類型相同的規則,因此每次定義新的用戶類型 時,都必須爲std::string添加一個函數。這將 實際上在C++中是可能的:如果std::string有一個成員 函數模板to,沒有一個通用的實現,你 可以添加一個專門針對每種類型,並調用 str.to<double>()str.to<MyType>()。但是,這是真的 你想要什麼。它似乎不是一個乾淨的解決方案給我, 讓每個人都寫一個新班級,必須添加 專業到std::string。把字符串類中的這些東西 混雜在一起,實際上是OO嘗試實現的 。

如果你要堅持純面向對象,他們將不得不成爲double 成員,int等(構造函數,真的。這是 Python做什麼,例如。)C++不堅持純 OO,並且不允許基本類型,如doubleint到 擁有成員或特殊構造。所以免費功能都是可以接受的解決方案,並且在語言環境中可以使用唯一的清理解決方案 。

FWIW:轉換到/從文字表述總是 一個微妙的問題:如果我的目標類型做,那麼我 介紹了在目標的不同來源和文本 匯依賴類型 - - 這些可能會隨時間變化。如果我在 源或接收器類型中執行此操作,則會使其依賴於正在轉換的類型 ,這更糟糕。 C++的解決方案是 定義一個協議(在std::streambuf),其中,用戶寫 一個新的自由功能(operator<<operator>>)來處理 的轉化,並在操作者重載解析計數 找到正確的功能。自由功能 解決方案的優點是,轉換既不是數據 類型的一部分(其因此不必知道的源和匯),也不 源或匯類型(因此不必知道約 用戶定義的數據類型)。這似乎是最好的解決方案 我。 stod等功能只是便利功能, 這使得一個特別頻繁的使用更容易編寫。