2014-04-08 51 views
0

這可能是一個非常基本的問題,我一直在google上搜索最近20分鐘。我不確定我是否正確地措詞,但我沒有得到我理解的解釋。試圖添加一個字符串對象到一個整數

基本上,我有一個字符串對象,當我添加一個整數值x時,它將字符串縮短x個字符。

下面是代碼:

#include <iostream> 
#include <string> 

void Print::print(std::string str) 
{ 
    std::cout << str << std::endl;  
} 


print("formatString:" + 5); 

輸出是:tString:

現在我意識到,上面是不正確的,我的搜索過程中我已經找到了正確的行爲,但我避風港」我發現內部實際發生了什麼,以獲得上述結果。

謝謝

+1

字符串文字是'const char [N]',而不是'std :: string'。 – chris

回答

2

答案很簡單:指針算術。

你的字符串字面量(的const char陣列包括隱含0終止),衰減到const char*上使用,您遞增並傳遞給你的print()功能全,從而調用std::string -constructor爲字符串文字。

所以,是的,你開始一個字符串對象(0結尾的數組const char),但不是std::string對象。

1

基本上,我有一個字符串對象

不,你沒有一個字符串對象。 "formatString:"不是std::string,而是一個「字符串」字面值。它實際上是一個const char*。 A const char*定義了一個operator +,它接受一個整數,並將指針的值與多個位置一起提前。在你的情況下它是5.

要得到一個編譯器錯誤,你必須將文字包裝在std::string中。

print(std::string("formatString:") + 5); 
+0

「要獲得編譯器錯誤,您必須將文字包裝在std :: string中。」 - LOL – Danvil

+1

字符串文字實際上是一個'const char []'(C++ 11,§2.14.5/ 8)。數組正在衰減到一個指針。 – cHao

0

「formatString的:」是一個字符串,其具有輸入const char[14]即它是常量字符的陣列大小等於14(該陣列包括終止零)。 在表達式這樣

"formatString:" + 5 

陣列被隱式轉換爲指針到它的第一個元素。因此,如果例如const char *p表示該指針則表達式看起來

p + 5 

的表達式的結果是指向與索引5數組的元素即有使用指針運算的指針。

P + 5指向字符串「tString」的第一個符號 並且此表達式由類std :: string的構造函數使用。

0

檢查以下,

#include <iostream> 

void print(std::string str) 
{ 
    std::cout << str << std::endl; 
} 

int main(int argc, char* argv[]) 
{ 
    //following two lines created implicitly by the compiler 
    const char* pstr = "formatString"; 
    std::string tmp(pstr + 5); //string c-tor: string (const char* s); 

    // now tmp: --> "tString" 

    print(tmp); 

    return 0; 
} 

pstr是一個指針,你正在做pointer arithmetic當您使用+操作。

注意:編譯器可能會創建不同的內部結構,但它是一個有啓發性的方式來思考上述兩條線。

相關問題