2017-03-07 45 views
1

分配在我無法理解分配中的字符串一些特定的行爲字符串

//method 1 
std::string s; 
s+='a' //This works perfectly 

//method2 
std::string s; 
s="" + 'a';//This gives unexpected value 

爲什麼第二個方法給出了意想不到的價值?從我讀過的字符串默認構造函數初始化字符串變量爲空字符串,如果沒有指定構造函數。 And s+='a'應該與s=s+a相同。那麼爲什麼方法2與方法1相同呢?

而就在同一個主題的多個查詢,如果我們不能與初始化字符文字,然後一個字符串,我們如何能夠賦予字給它一個char?

std::string s2='a'//gives error while compiling 

std::string s2; 
s2='a'//works perfect 

從我個人理解是因爲字符串構造函數需要的類型(const char *)的說法,我們不能用char變量初始化字符串變量。爲什麼分配時沒有這種限制?

+2

'「foo」的'不是'的std :: string',它是一種*字符串文字*,這是'char',更多或更少的一個'字符常量*'的陣列。如果你想對它執行'std :: string'類型的操作,你必須先把它變成一個:'std :: string(「foo」)'。 – BoBTFish

+0

BoBTFish是對的,試試'std :: string(「」)+'a'' – Steeve

+1

增加警告等級。我敢打賭你會收到警告。 –

回答

2

對於第一個查詢,

方法1作品完美地導致該方法要添加字符串對象類型和字符文字。 和s+='a',確實與s=s+'a'

重點關注的事實是s是字符串對象類型而不是字符串文字。

在第二種方法中,您將添加字符串文字 和字符字面值。重點介紹兩者的區別,在第一種方法中有字符串對象可以將字符串或字符串添加到字符串對象類型中,它的字符串對象類型提供的其中一個功能。但是你不能添加簡單地相互添加文字。在c + +,但是「StringLiteral1」「StringLiteral2」,將導致兩個字符串文字的串聯。

的第二查詢,

初始化是不一樣的分配,String對象的默認構造函數需要const char *初始化。作業是一個完全不同的故事(如果沒有,請別人糾正我)。

+0

*「默認構造函數採用'const char *'」* – LogicStuff

+0

那麼,如果它需要參數,它不是一個* default *構造函數。它只是非默認構造函數之一。 – user2079303

0

當您編寫s="" + 'a';請記住,""不是std::string而是const char*。而const char*沒有預定義的連接運算符。這就是爲什麼你有一個意外的行爲,而不是串聯。

+0

_「而const char *沒有預定義的+運算符。」_它已經。有沒有聽說過指針aritmethics? –

+0

的OP說,'「」 +''了'「劑量不給一個錯誤,但意想不到的效果。 –

+0

@πάνταῥεῖ對不起糾正它。 –

2

""是一個字符串const char[]類型,並且所添加的字符串文字,即指針的第一個元素,'\0',另一個字符。這自然會給你一些你想要的東西。

如果您希望它與s += 'a'相同,則需要使用std::string文字:s += ""s + 'a';。這工作,因爲""s是一個空std::string,你只需添加另一個字符它。