Skip to content

Instantly share code, notes, and snippets.

@pknam
Last active December 17, 2017 12:05
Show Gist options
  • Save pknam/6d9c0c3afe2b8076bba70a70981ea529 to your computer and use it in GitHub Desktop.
Save pknam/6d9c0c3afe2b8076bba70a70981ea529 to your computer and use it in GitHub Desktop.
rvalue test
#include <iostream>
#include <string>
using namespace std;
class AA
{
string* data;
public:
// 생성자
AA() {}
AA(const string& s)
{
data = new string(s);
}
// 소멸자
virtual ~AA()
{
cout << "~소멸자 ";
if (data)
{
cout << "data 파괴";
delete data;
}
cout << endl;
}
public:
// 이동생성자
AA(AA&& rhs)
{
MoveFrom(move(rhs));
cout << "이동 생성" << endl;
}
// 이동 대입연산
void operator = (AA&& rhs)
{
if (data)
{
delete data;
}
MoveFrom(move(rhs));
cout << "이동 대입연산" << endl;
}
public:
// 복사생성자
AA(const AA& lhs)
{
cout << "복사 생성" << endl;
CopyFrom(lhs);
}
// 복사 대입연산
void operator = (const AA& lhs)
{
if (data)
{
delete data;
}
CopyFrom(lhs);
cout << "복사 대입연산" << endl;
}
private:
void MoveFrom(AA&& rhs)
{
// 포인터만 옮겨온다.
// 데이터를 복사하지 않으므로 성능향상
data = rhs.data;
rhs.data = nullptr;
}
void CopyFrom(const AA& lhs)
{
// 메모리를 새로 할당하고
// 데이터도 복사해온다
if (lhs.data)
{
data = new string(*lhs.data);
}
else
{
data = nullptr;
}
}
};
int main()
{
{
AA aa_src("hihi");
AA aa_copy(aa_src); // 복사 생성
AA aa_move(move(aa_src)); // 이동 생성
}
cout << "-------------" << endl;
{
AA bb_src("heyhey");
AA bb_dst;
bb_dst = bb_src; // 복사 대입
bb_dst = move(bb_src); // 이동 대입
}
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment