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 답변
-
안녕하세요. 오랜만에 여기 들어와봤는데 좋은 질문이 있네요.
이미 궁금증을 해결하셨을 수도 있지만...혹시 모르니 답변을 남깁니다ㅎㅎ
질문하신 것처럼 해당 코드에서 반환값을 받는 변수에 레퍼런스(&)를 붙이든 안 붙이든 결과는 똑같아 보일 수 있습니다.
하지만 그 작동 원리는 다르기 때문에 이 점을 잘 짚고 넘어가셔야 할 듯 합니다.
두 가지 케이스의 다른 점을 간단히 요약해보면,
- 임시객체를 생성하지 않고, 대입할 변수 위치에 객체를 생성한다.
- 임시객체를 생성하고, 해당 객체의 참조를 변수에 대입한다.
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)타입이기 때문에 타입추론이 다르게 적용됨.)
댓글 입력