的區別是什麼,如果有下列片段的效果之間:+ -ing字符串和<< - 在c + +中的字符串之間有任何區別?
cout << "Some text" << s1 << "some more text\n";
cout << "Some text" + s1 + "some more text\n";
的區別是什麼,如果有下列片段的效果之間:+ -ing字符串和<< - 在c + +中的字符串之間有任何區別?
cout << "Some text" << s1 << "some more text\n";
cout << "Some text" + s1 + "some more text\n";
運算符+字符串的結果是一個新的字符串。因此,在這個例子中
cout << "Some text" + s1 + "some more text\n";
在整個事情被寫入cout之前,會創建兩個新字符串(意味着內存分配)。在你的第一個例子中,所有東西都直接寫到cout中,沒有不必要的內存分配。
第二符連接送他們來清點,這是一個性能問題,可能相當大串大前的字符串。如果可以的話,你總是希望使用第一種形式。
是的,string operator+ (const char* lhs, const string& rhs)
創建並返回一個未命名的臨時字符串對象。
cout << "Some text"
調用的ostream &的ostream ::運算< <(爲const char * const的)並返回ostream的參考。
cout << "Some text" << s1 << "some more text\n";
是cout上ostream::operator<<("Some text").operator<<(s1).operator<<("some more text\n")
,三個電話,稱運< <兩個不同的重載,這需要一個const* char* const
運< <和運< <,需要一個const string&
。沒有內存分配,唯一的複製是cout的緩衝區。
cout << "Some text" + s1 + "some more text\n";
是ostream::operator<<(t1)
臨時字符串對象,我會打電話T1,其中T1從::operator+ ("Some text", s1).operator+("some more text\n")
臨時結果。 (請注意,第一個運算符+不是字符串的成員,而是命名空間範圍的op +(const char * const,const字符串&)。它返回一個字符串,所以第二個+「是string :: operator +(const char * const )。)
因此,在這段代碼中創建了兩個臨時字符串對象(然後被析構),這意味着兩個字符串的內部表示(所以兩個內存分配)和兩個拷貝兩個新分配的內存(除了。複製到COUT的緩衝區)
考慮以下幾點:
cout << "Some text" + " " + "some more text\n";
它不會做什麼 您認爲。運算符+並不總是意味着連接。
編輯:當應用於原始字符串時,operator +不會連接 - 它會將指針的地址添加到字符串中。結果幾乎保證是無稽之談,因爲它指向與任何原始字符串都沒有關係的內存區域。運氣好的話會讓你的程序崩潰。
編輯2:顯然,我犯了這個錯誤已經很長時間了。結果非常荒謬,編譯器拒絕編譯它。
不要co Mark馬克,解釋它是增加了兩個指針。 – tpdi 2009-04-08 03:53:28