2015-01-21 2 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 :

charStr ABCDEFGHIJKLMNOPQRSTUVWXYZ :시 nums에 할당 된 메모리에 어떻게됩니까

ABCDEFGHIJKLMNOPQRSTUVWXYZ 이니 시아 라이 제이션?

+0

스택에 할당됩니다. – leppie

답변

1
std::string &charStr = nums; 

여기 charStrnums 참조된다. 따라서 charStr의 값을 변경하면 numscharStr이 모두 같은 메모리 위치를 참조하기 때문에 nums의 값이 변경됩니다. charStr 값 변경은

charStr=alpha; 

nums의 값을 변경한다. 이 모든 nums, alpha, charStr

값이 동일한 (abcdefghijklmnopqrstuvwxyz)

+0

그래서 문자열 "1234567890"에 대한 참조를 풀 것입니다. ?? – surender8388

+0

@ surender8388'string s '과 같은 방식으로 이들 문자를 덮어 씁니다. s = "abc"; s = "def";'- 이전 내용' "abc"'는 이제 사라졌습니다 –

+0

그러나 num의 길이는 10이고 alpha의 길이는 26입니까? num 또는 손상을위한 메모리를 업데이트 할 것인가? – surender8388

2

참조 별칭이다. 이 줄 끝 numscharStr :

std::string &charStr = nums; 

개의 이름을 갖는 하나 개의 변수가있다. 이 두 이름은 hereon과 같습니다. 우리는 "진짜"이름이 하나이고 "참조"가 다른 것이라고 말할 수 없습니다.

라인 :

charStr = alpha; 

는 과제이다. (= 기호는 선언문에서와는 다른 의미를 선언문과는 다르기 때문에이 줄과 charStr의 선언 사이에 정신적 평행선을 그리지 마십시오.)

std::string에 대한 할당 효과는 왼쪽에서 문자가 오른쪽에서 복사된다는 것입니다 (필요한 경우 추가 저장 공간 할당). 따라서 이름이 numscharStr 인 문자열은 alpha에서 복사 된 문자를 가져옵니다.

이것은 참조와 관계가 없으며, nums = alpha;을 작성한 것과 같습니다.

+0

num (길이 10)을 문자열 알파 (길이 26)로 복사하면 메모리 손상이 발생하지 않습니다. 이 인스턴스에서 num은 더 많은 저장 공간을 제공합니까? – surender8388