개발개발/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