• 8.13.1 익명 객체(Anonymous Objects)

8.13.1 익명 객체(Anonymous Objects)

 

객체에 특정 이름을 붙여서 인스턴스화를 하지 않고 멤버 함수를 사용할 수 있는 방법이 존재하는데 바로 익명 객체를 사용하는 것이다.

#include <iostream>

using namespace std;

class A
{
public:
	int m_value;

	A(const int& input)
		: m_value(input)
	{
		cout << "Constructor" << endl;
	}

	~A()
	{
		cout << "Destructor" << endl;
	}

	void print()
	{
		//cout << "Hello" << endl;
		cout << m_value << endl;
	}
};

int main()
{
	A a(3);
	a.print();

	A(1).print(); // 생성자 소멸자 호출
	A(2).print(); // 생성자 소멸자 호출

	return 0;
}

위의 코드를 실행시켜보면 두 번째와 세 번째 멤버 함수를 호출할 때 생성자와 소멸자를 호출하는 것을 볼 수가 있다. 첫 번째 멤버 변수의 경우 인스턴스화를 하면서 변수에 이름을 짓게 되는데, 그 외의 함수를 호출할 때는 그러지 않았다. 이처럼 익명 객체를 사용하게 되면 객체를 생성해서 멤버 함수를 사용하고 바로 파괴하는 과정을 거치게 된다.

 

#include <iostream>

using namespace std;

class Cents
{
private:
	int m_cents;

public:
	Cents(int cents) 
	{
		m_cents = cents;
	}
	
    	// 멤버 변수를 변경하지 않기 때문에 const가 붙는다.(멤버 함수에 붙는다.)
	int getCents() const
	{
		return m_cents;
	}
};

Cents add(const Cents& c1, const Cents& c2)
{
	return Cents(c1.getCents() + c2.getCents());
}

int main()
{
	cout << add(Cents(6), Cents(8)).getCents() << endl;

	return 0;
}

이런 방식으로 익명 객체를 활용할 수도 있겠다. 함수 뒤에 const는 멤버 함수가 멤버 변수를 변경하지 않는다는 의미를 컴파일러에게 표시해주는 것으로 유지보수에 도움이 되니 기억해두도록 하자! 참고로 개발자 면접에도 간혹 나오는 개념이다!

+ Recent posts