임시 객체는 주로 함수가 반환할 때 많이 생기는 객체이다.
#include <iostream>
using namespace std;
class SoSimple {
private:
int num;
public:
SoSimple(int n) :num(n) {
cout << "New Object : " << this << endl;
}
SoSimple(const SoSimple& copy) :num(copy.num) {
cout << "New Copy obj : " << this << endl;
}
~SoSimple() {
cout << "Destroy obj : " << this << endl;
}
};
SoSimple SimpleFuncObj(SoSimple ob) {
cout << "Parm ADR : " << &ob << endl;
return ob;
}
int main() {
SoSimple obj(7);
SimpleFuncObj(obj);
cout << endl;
SoSimple tempRef = SimpleFuncObj(obj);
cout << "Return Obj " << &tempRef << endl;
return 0;
}
위 예제를 잘 보자. 신경써서 보아야 할 부분들은 언제 어떤 생성자가 호출되고, 어느 시점에서 임시 객체가 생성되는지이다.
New Object : 000000062A2FF5A4
New Copy obj : 000000062A2FF6A4
Parm ADR : 000000062A2FF6A4
New Copy obj : 000000062A2FF6E4
Destroy obj : 000000062A2FF6A4
Destroy obj : 000000062A2FF6E4
New Copy obj : 000000062A2FF704
Parm ADR : 000000062A2FF704
New Copy obj : 000000062A2FF5C4
Destroy obj : 000000062A2FF704
Return Obj 000000062A2FF5C4
Destroy obj : 000000062A2FF5C4
Destroy obj : 000000062A2FF5A4
위 코드를 ctrl+F5를 통해 console에 찍어보면 다음과 같은 결과가 나온다. main 함수 내부를 하나하나 보면서 어떻게 동작하는지 면멸히 알아보자.
SoSimple class type의 obj 객체를 생성하는 부분이다. 구현한 기본 생성자가 호출되는 것을 확인할 수 있다.
우선 SimpleFuncObj 함수 parameter를 받는 부분에서 call by value로 값을 받았으므로, ob 객체가 복사 생성자를 통해 선언 및 초기화된다. 그 다음 SimpleFuncObj 함수 내부를 실행. 마지막으로 return문에서 임시 객체가 복사 생성자를 통해 생성되고 반환된다.
SimpleFunObj 함수가 종료되면 함수 내부 스택에 생성되었던 ob 객체와 임시객체들이 지워지면서 각각에 대해 소멸자가 실행된다.
이번에는 함수의 return 값을 tempRef라는 변수에 저장해 놓는 경우이다. 이 경우는 return을 위해 복사 생성자로 생성된 임시 객체가 함수 종료와 함께 바로 사라지는 것이 아니다. 이 값은
아래 링크에서 많은 설명 및 예제를 참고했습니다.
링크