2013-04-01 119 views
1

我需要深入的技術說明來解釋我要問什麼,而不是解決方案。「const char *」和「const string」之間的EXACT技術區別是什麼?

我一直在學習一個星期的指針,我很瞭解它。不過,雖然寫一個程序,我偶然發現了這個錯誤:

cannot convert ‘const std::string’ to ‘const char*’ for argument ‘2’ to ‘char* strcpy(char*, const char*)’

所以我string.c_str()沒有問題的解決很容易。但我對這是爲什麼很感興趣。我一直在尋找瘋狂的爲什麼一個const字符串是不一樣的const char *。當人們解釋一個字符串時,他們說它與char *沒有什麼不同,那麼爲什麼在字符串之前添加一個const不會使它成爲const char *

+0

一個是類,一個是指向原始數據類型的指針? – Xymostech

+0

'char *'是一個指向「字符串」的指針,但不是字符串本身。因此,那個錯誤 –

回答

2

string意味着保持文本數據(字符串)的對象,和char*指針到,是爲了保持文本數據(字符串)的存儲塊。

A string「知道」它的長度,但char*只是一個指針(指向一個字符數組) - 它沒有長度信息。因此,爲了您能夠推導由char*代表的「串」的長度,你必須在C.

一些特別的東西,這是傳統的空字符 '\0'

終止它,但一個string沒有按」 t終止本身'\0'(這是額外的工作沒有好處),所以問題變成:如果你需要在兩種格式之間進行轉換怎麼辦?

char*轉換爲string可能會隱式發生 - string僅爲此目的而具有構造函數。但是,如果要反過來,你必須告訴string對象爲空終止本身,併爲你的目的給你一個有效的指針。 (它不會那麼隱含,因爲它可能需要額外的工作和/或導致代碼中的事故。)

+0

如果一個字符串是一個對象,而不是很多書是錯誤的解釋一個字符串不過是一個字符數組或字符指針,我說得對嗎? – userX

+0

@ reconx86:你混淆了兩個不同的東西:* std :: string' *是一個對象,但「一個字符串」只是一個詞,意思是「一段文本」。你可以用任何你想要的方式代表*「一個字符串」(意思是「文本」),並且通常使用'char *',一個'std :: string'對象或者這些行代表它。確保你瞭解本書所談論的內容 - 對象或抽象概念。 – Mehrdad

+0

我指的是std :: string,所以只是爲了讓我的腦袋有條不紊 – userX

相關問題