임시 객체

Ryan Ham·2024년 5월 27일
0

C++

목록 보기
14/26

임시 객체는 주로 함수가 반환할 때 많이 생기는 객체이다.

#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 obj(7) <<main 1번째 줄

SoSimple class type의 obj 객체를 생성하는 부분이다. 구현한 기본 생성자가 호출되는 것을 확인할 수 있다.

  • SimpleFuncObj(obj) <<main 2번째 줄

    우선 SimpleFuncObj 함수 parameter를 받는 부분에서 call by value로 값을 받았으므로, ob 객체가 복사 생성자를 통해 선언 및 초기화된다. 그 다음 SimpleFuncObj 함수 내부를 실행. 마지막으로 return문에서 임시 객체가 복사 생성자를 통해 생성되고 반환된다.

  • main 3번째 줄

    SimpleFunObj 함수가 종료되면 함수 내부 스택에 생성되었던 ob 객체와 임시객체들이 지워지면서 각각에 대해 소멸자가 실행된다.

  • SoSimple tempRef = SimpleFuncObj(obj) << main 4번째 줄

    이번에는 함수의 return 값을 tempRef라는 변수에 저장해 놓는 경우이다. 이 경우는 return을 위해 복사 생성자로 생성된 임시 객체가 함수 종료와 함께 바로 사라지는 것이 아니다. 이 값은


Reference

아래 링크에서 많은 설명 및 예제를 참고했습니다.
링크

profile
🏦KAIST EE | 🏦SNU AI(빅데이터 핀테크 전문가 과정) | 📙CryptoHipsters 저자

0개의 댓글