2014-04-08 52 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当您使用+操作。

注意:编译器可能会创建不同的内部结构,但它是一个有启发性的方式来思考上述两条线。

相关问题