Last active
December 17, 2017 12:05
-
-
Save pknam/6d9c0c3afe2b8076bba70a70981ea529 to your computer and use it in GitHub Desktop.
rvalue test
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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