728x90
#include <iostream>
using namespace std;

class A
{
public:
	void print()
	{
		cout << "Hello" << endl;
	}
};

int main()
{
	A a;
	a.print();
	return 0;
}

 

class A 함수의 print 함수를 사용할 땐 보통 이렇게  a라는 변수를 만들고 a.print(); 를 사용해 함수를 사용합니다.

print()라는 함수가 Hello를 출력하는 것 외엔 별다르게 하는 일이 없기 때문에 a를 선언하고 a.print()를 하는 것이

번거로울 수도 있습니다.

 

int main()
{
	A().print();
	return 0;
}

 

그래서 이렇게 2줄의 코드를 1줄로 줄일 수도 있습니다.

요기서 A()는 Lvalue가 아닌 Rvalue처럼 작동하고 있습니다.

A(). print()는 장점도 있지만 단점도 존재합니다. 한번 쓰면 사라져 버리는 일회용 성이라 재사용이 불가능합니다.

 

int main()
{
	A().print();
	A().print();
	return 0;
}

 

이렇게 두 번의 호출을 하게 되면 첫 번째 A()의 객체와 두 번째 A() 객체는 다릅니다

 

 

메모리 주소 값이 다른 걸 확인할 수 있습니다.

 

#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 << m_value << endl;
	}
};

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

	A(1).print();
	
 	return 0;
}

 

생성자와 소멸자를 통해 inpute으로 값을 하나 전달받고 class 가 언제 생성되고 언제 소멸되는지 확인해 보겠습니다.

 

 

 

A a(1);
a.print();
    
A(1).print();

a.print(); 에서 class가 생성된 뒤 A(1). print(); 에서 다른 class 가 하나 더 생성됩니다

그리고 A(1). print();의 클래스가 먼저 소멸된 뒤 return 0; 밑 괄호의 밖을 나가는 순간 a.print()에서 생성된 class가

소멸돼서 사라집니다.

 

 

#include <iostream>
using namespace std;

class Cents
{
private:
	int m_cents;

public:
	Cents(int cents) { m_cents = cents; }

	int getCents() const { return m_cents; }
};

//Cents 를 리턴하는 함수
Cents add(const Cents &c1, const Cents &c2)
{
	return Cents(c1.getCents() + c2.getCents());
}

int main()
{
	cout << add(Cents(7), Cents(9)).getCents() << endl;
	
 	return 0;
}

 

Cents Class를 만들고 Cents를 리턴하는 함수를 class 밖에서 생성합니다.

익명 함수를 사용해 add 함수에 파라미터로 class의 member 변수를 값으로 넘기고 

add 함수에서 값을 받아 getCents() 호출하여 m_cents를 리턴 받습니다.

 

add 함수는 Cents 클래스 자체를 return 하기 때문에 getCents를 사용할 수 있습니다

 

결과는 

 

익명 함수는 Lvalue 가 아닌 Rvalue처럼 작동합니다.

728x90