2015-01-21 71 views
0

遇到了一个场景,我无法弄清楚实际发生的情况。在cpp中处理字符串参考

//这是CPP计划。

#include <iostream> 
#include <time.h> 
using namespace std; 

int main() { 
    std::string nums ("1234567890"); //What happens with this memory?? 
    std::string alpha ("abcdefghijklmnopqrstuvwxyz"); 

    std::string &charStr = nums; 
    charStr = alpha; 

    cout <<"nums : " << nums <<endl; 
    cout <<"alpha :" << alpha <<endl; 
    cout <<"charStr :" << charStr <<endl; 

    return 0; 
} 

输出是:

NUMS:ABCDEFGHIJKLMNOPQRSTUVWXYZ

阿尔法:ABCDEFGHIJKLMNOPQRSTUVWXYZ

charStr:ABCDEFGHIJKLMNOPQRSTUVWXYZ

与时间分配给NUMS内存会发生什么初始补肾中药?

+0

它被分配在堆栈上。 – leppie 2015-01-21 05:40:03

回答

1
std::string &charStr = nums; 

这里charStr成为对nums的参考。因此,如果您更改charStr的值,它将更改nums的值,因为numscharStr都指向相同的内存位置。

charStr=alpha; 

更改的charStr值更改的nums值。

这一切numsalphacharStr后具有相同的值(abcdefghijklmnopqrstuvwxyz

+0

所以我会放弃对字符串“1234567890”的引用? – surender8388 2015-01-21 05:45:52

+0

@ surender8388这些字符会被覆盖,就像你去'string s; s =“abc”; s =“def”;' - 以前的内容'“abc”'现在不见了 – 2015-01-21 05:47:04

+0

但是num的长度是10而alpha的长度是26?是否会更新内存nums或腐败会发生? – surender8388 2015-01-21 05:51:27

2

的引用是一个别名。此行之后:

std::string &charStr = nums; 

有它有两个名字一个变量:numscharStr。这两个名字相同于此;我们不能说“真实”的名字是一个,“参考”是另一个。

线:

charStr = alpha; 

是一个赋值。 (=符号在声明中的含义与在非声明声明中的含义不同;因此不要试图在此行与前面charStr的声明之间找到精神上的相似之处)。

赋值对std::string的影响是,左侧从右侧复制字符(如果需要,分配更多存储空间);所以名称为numscharStr的字符串会从alpha中获取复制的字符。

这与参考文献无关,与编写nums = alpha;相同。

+0

因此,您意味着在使用字符串alpha(长度为26)复制nums(长度为10)时不会有任何内存损坏?在这种情况下,数量将会提供更多的存储空间? – surender8388 2015-01-21 05:49:33