C++ Rookiss Part1 C++ 프로그래밍 입문 : rvalue
🙇♀️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 참조는 이동 개념이 크다!