🙇‍♀️rvalue


🪐rvalue

#include <iostream>
using namespace std;

class Pet
{
public:

};


class Knight
{
public:

	Knight()
	{
		cout << "Knight()" << endl;
	}

	~Knight()
	{
		cout << "~Knight()" << endl;

		if (_pet)
			delete _pet;
	}

	// 복사 생성자
	Knight(const Knight& Knight)
	{
		cout << "const Knight&" << endl;
	}

	Knight(Knight&& knight)
	{
		cout << "const Knight&&" << endl;
	}

	// 복사 대입 연산자
	void operator=(const Knight& knight)
	{
		cout << "operator=(const Knight&)" << endl;

		// 깊은 복사
		_hp = knight._hp;

		if (knight._pet)
			_pet = new Pet(*knight._pet);
	}

	void operator=(Knight&& knight) noexcept
	{
		cout << "operator=(Knight&&)" << endl;

		_hp = knight._hp;

		_pet = knight._pet;
		knight._pet = nullptr;

	}

public:
	int _hp = 100;
	Pet* _pet = nullptr;
};

void TestKnight_Copy(Knight Knight) { }
void TestKnight_LvalueRef(Knight& Knight) { }
void TestKnight_ConstLvalueRef(const Knight& Knight) { }
void TestKnight_RvalueRef(Knight&& Knight) { } // 이동 대상!!

int main()
{


	Knight k1;


	TestKnight_Copy(k1);

	TestKnight_LvalueRef(k1);

	TestKnight_ConstLvalueRef(k1);
	TestKnight_ConstLvalueRef(Knight());

	// TestKnight_RvalueRef(k1); // Lvalue를 넣을 수 없음
	TestKnight_RvalueRef(Knight()); // 임시객체 이므로 Rvalue, Rvalue는 대입 가능


	Knight k2;
	k2._pet = new Pet();
	k2._hp = 1000;


	// 원본은 날려도 된다 << 라는 힌트를 주는 쪽에 가깝다
	Knight k3;
	//k3 = static_cast<Knight&&>(k2);

	k3 = std::move(k2);

}

rvalue 참조는 이동 개념이 크다!

태그:

카테고리:

업데이트: