개발개발/c++
c++의 임시객체
유잉유잉유잉
2024. 12. 20. 23:52
728x90
▶️임시객체
참고블로그 : https://vansoft1215.tistory.com/27
실행 도중에 잠깐만 사용되는 객체로, 소스코드에도 없는 힙 이외의 공간에 생성되는 객체입니다.
int Test(int num)
{
std::cout << num << std::endl;
return num;
}
int main()
{
int num = 10;
Test(num);
return 0;
}
Test함수에 num을 인자로 넘겨주면 Test함수에서만 사용가능한 int num이라는 임시객체를 생성하게 됩니다.
인자로 받은 num은 값복사가 이뤄지며, Test()함수에서 return 할때도 int형 임시객체를 생성하여 리턴하게 됩니다.
=> 임시객체를 이용하여 값복사를 할 경우 성능저하를 유발하기 때문에 참조에 의한 복사를 이용하는것이 좋습니다.
객체 이름이 존재할 경우 생성자 객체가 생성되고
객체의 이름이 존재하지 않을 경우 임시객체가 생성됩니다
class CTemp
{
public:
CTemp () {}
CTemp ( int num )
{
mNumber = num;
}
CTemp ( const CTemp& obj )
{
}
~CTemp () {}
public:
private:
int mNumber = 444;
};
int main ()
{
// 이건 임시 객체가 발생.
CTemp temp;
temp = CTemp ( 30 ); // 대입 후 바로 소멸자 호출됨
CTemp temp2 = CTemp ( 40 ); // 이건 임시객체가 발생하지 않음. 대입후에 바로 소멸자가 호출되지 않음
return 0;
}
▶️임시객체의 특징
- 임시객체는 주소연잔자로 주소를 구할 수 없습니다
CTemp* temp3 = &CTemp ( 50 ); // [error] '&'에 l-value가 있어야 합니다.
- 임시객체는 lvalue가 될 수 없습니다. 왼쪽에 올 수 없습니다.
CTemp ( 50 ) = 10; // 컴파일러 버전에 따라 에러가 안나기도 함..
- 임시객체는 일반적인 참조가 불가능합니다. 그러나 상수 참조는 가능합니다.
- 임시객체는 다음행으로 넘어가면, 바로 소멸합니다. 그러나 참조자에 참조되는 임시객체는 바로 소멸되지 않습니다.
CTemp& ref = CTemp ( 100 ); // [error] 비const 참조에 대한 초기 값은 lvalue여야 합니다.
const CTemp& ref2 = CTemp ( 100 ); // ref가 파괴될 때 까지 임시 객체 존재 // 다음행이 되어도 바로 소멸자가 호출되지 않습니다.
▶️ lvalue와 rvalue
- lvalue (좌측값) : & 연산자를 이용하여 메모리의 주소를 가져올 수 있는 값입니다. 식의 왼쪽, 오른쪽 모두 올 수 있습니다.
- rvalue (우측값) : 주소를 가져올 수 없는 값. 리터럴 값. 식의 오른쪽에만 올 수 있습니다.
// num변수 : lvalue
// 10 : rvalue
int num = 10;
728x90