2016-03-01 86 views
3

我想在C++中構造一個字符串,如下所示。這裏調用了哪個std :: string構造函數?

const char *cstring = "abcd"; 
const string cppstr = string(cstring, cstring + strlen(cstring)); 

這是工作的罰款和cppstr的值爲「ABCD」,即使它不符合任何標準中指定的字符串構造函數。任何人都可以讓我知道在這個特殊情況下哪個字符串的構造函數被調用。

回答

5

有一個模板化構造函數,它將輸入兩個InputIterator作爲輸入。 (見the cppreference.org reference, constructor (6))。原始C++指針滿足InputIterators的所有要求(實際上,它們是RandomAccessIterators)。因此,致電

string(cstring, cstring + strlen(cstring) 

調用此構造函數。該構造函數的工作原理是遍歷迭代器描述的元素的範圍,並將字符串構造爲這些元素的副本。

作爲一個說明,你也可以只寫

const string cppstr{cstring, cstring + strlen(cstring)}; 

在這裏,而不是分配cppstr的值。

+0

甚至只是'const string cppstr {cstring};' – rici

+0

@rici:如果我使用const string cppstr(cstring),創建的字符串將包含'\ 0'。 – kadina

+0

@kadina你確定嗎?構造函數被設計爲在它遇到空終止符時立即停止。 – templatetypedef

相關問題