2014-12-15 2 views
7

C++에서 개체 변수를 다시 할당하면 원래 값은 어떻게됩니까? 아래 코드에서 객체는 스택에 생성되고 변수에 배치됩니다. 그런 다음 새 객체가 스택에 만들어져 동일한 변수에 배치됩니다. 원본 개체는 어떻게됩니까? 변수이 범위를 벗어날 때까지 스택에 남아 있습니까? 기술적으로 operator=가 assignement의 왼쪽 부분에 의해 호출C++에서 객체 변수를 재 할당하면 원래 객체는 어떻게됩니까?

void foo() { 
    ClassName variable(a, b); // variable created on the stack 
    variable = ClassName(c, d); // new value for variable created on stack 
    ... 
} 
+4

일반적으로 발생하는 모든 것은 원본 개체가 수정되는 것입니다. – juanchopanza

답변

9

어떻게 되나요? 클래스의 할당 연산자가 호출됩니다. 대부분의 경우에는 이전 객체의 내용이 새 객체의 값으로 업데이트된다는 것을 의미합니다. ClassName 그래서 만약 것은 :에 해당 될 기본 할당 연산자를 호출 할 것이다이 경우

struct ClassName 
{ 
    int a; 
    int b; 

    ClassName(int a, int b) : a(a), b(b) {} 
}; 

: 동적 콘텐츠가 할 수있는 좀 더있을 것이 클래스에 대한

ClassName& operator=(const ClassName& other) 
    { 
     a = other.a; 
     b = other.b; 
     return *this; 
    } 

, 결과는 일반적으로 동일합니다. 대입 연산자를 재정의 할 수 있기 때문에 이론적으로는 아무 것도 발생할 수 있지만 이것이 우리가 기대하는 바입니다.

+0

좋습니다, 감사합니다! 이것은 그것을 지 웁니다. – naavis

3

, 같은 귀하의 경우에는

variable.operator=(ClassName(c,d)); 

로 명시 적으로 할당 연산자를 정의하지 않는 경우, 컴파일러가 생성 기본값은 사용자의 개별 사본 할당 연산자를 사용하여 오른쪽을 복사하는 것입니다. 왼쪽 사이드 (예 : variable)가 수정되며 개별 회원은 오른쪽 멤버 멤버의 사본입니다.

4

실제로 개체에 아무런 변화가 없습니다. 아직 사용 중입니다.!

할당은 전체 객체를 다른 객체로 대체하지 않습니다. 할당은 원래 객체의 할당 연산자를 호출하여 객체가 새로운 객체처럼 보이도록합니다. 예를 들어

:

int x = 1; 
x = 2; 

는 당신은 심지어는 값이 변경하지만, 객체 여기 선언했다.

물론이 간단한 스 니펫에도 실제로 많은 객체가 있습니다. — 12은 정수 리터럴과 임시 객체입니다. 그러나 당신이 물어 본 것은 이것들이 아닙니다. 그 값은 x에 복사됩니다.

마찬가지로 코드에서 ClassName(c, d)의 "값"은 variable으로 복사되지만 variable은 여전히 ​​원래 variable입니다.

임시 ClassName(c, d)은 사용자가 사용한 행의 끝 부분에서 범위를 벗어납니다. 그것을 표현하는 데 사용 된 바이트 (최적화되지 않은 경우)는 합법적으로 읽을 수는 없지만 함수 범위를 벗어날 때까지 스택 프레임 내에있을 것입니다.

관련 문제