2015-01-21 67 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