c++에서 임시객체의 사용법

조회수 2981회

아래 주석이 표시된 지점에서SimpleFuncObj함수의 반환이 객체인데 그 과정에서 임시변수가 생성됨과 동시에 참조값이 반환된다고 알고있습니다.

그리고 아래 결과창을 보게되면SoSimple tempRef = SimpleFuncObj(obj)에서 반환되는 임시객체에tempRef라는 이름을 할당하고 있음을 보여줍니다...

근데 그 참조값을 객체tempRef가 참조하려면 SoSimple tempRef = SimpleFuncObj(obj) 이 아니라SoSimple &tempRef = SimpleFuncObj(obj)와 같이 참조자 선언을 해주어야 하는거 아닌가요??

위의 것이 단지 임시변수의 특징인지? 그렇지 않다면 왜 저렇게 해도 성립하는지 궁금합니다.

아래에는 코드와 그 결과값이 적혀있습니다.

#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(void)
{
    SoSimple obj(7); 
    SimpleFuncObj(obj);

    cout << endl;
    SoSimple tempRef = SimpleFuncObj(obj); //궁금한 부분!!!!!!!!!!
    cout << "Return Obj" << &tempRef << endl;
    return 0;
}
  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

  • 안녕하세요. 오랜만에 여기 들어와봤는데 좋은 질문이 있네요.

    이미 궁금증을 해결하셨을 수도 있지만...혹시 모르니 답변을 남깁니다ㅎㅎ


    질문하신 것처럼 해당 코드에서 반환값을 받는 변수에 레퍼런스(&)를 붙이든 안 붙이든 결과는 똑같아 보일 수 있습니다.

    하지만 그 작동 원리는 다르기 때문에 이 점을 잘 짚고 넘어가셔야 할 듯 합니다.

    두 가지 케이스의 다른 점을 간단히 요약해보면,

    1. 임시객체를 생성하지 않고, 대입할 변수 위치에 객체를 생성한다.
    2. 임시객체를 생성하고, 해당 객체의 참조를 변수에 대입한다.
    int main()
    {
        SoSimple obj(7); 
    
        SoSimple returnVal = SimpleFuncObj(obj);    // 1번 케이스
        cout << "Return Obj: " << &returnVal << endl;
    
        SoSimple& tempRef = SimpleFuncObj(obj);    // 2번 케이스
        cout << "Temp Obj: " << &tempRef << endl;
    
        return 0;
    }
    

    사실 위 코드는 결과만 놓고 보면 두 케이스의 차이가 없다고 봐도 되긴 합니다. 하지만 좀 더 복잡한 상황에서는 차이가 발생하게 됩니다.

    (저 변수들을 템플릿 인자로 넘긴다면, 1번은 값(value)타입이고, 2번은 참조(reference)타입이기 때문에 타입추론이 다르게 적용됨.)

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)