#include <iostream>
#include <vector>
#include <cstring>
#pragma warning(disable:4996)
class AAA
{
private:
char* data;
public:
AAA(const char* data)
{
this->data = new char[1000000];
std::strcpy(this->data, data);
std::cout << "Call AAA(char * data)![data:" << this->data << "] / this : [" << this << ']' << std::endl;
}
AAA(const AAA& ref)
{
this->data = new char[1000000];
std::strcpy(this->data, ref.data);
std::cout << "Call AAA(const AAA& ref)![data:" << this->data << "] / this : [" << this << ']' << std::endl;
}
AAA(AAA&& ref) : data(ref.data)
{
ref.data = nullptr;
std::cout << "Call AAA(AAA&& ref)![data:" << this->data << "] / this : [" << this << ']' << std::endl;
}
~AAA()
{
if (this->data != nullptr)
{
std::cout << "Call ~AAA()![data:" << this->data << "] / this : [" << this << ']' << std::endl;
delete[]this->data;
}
else
{
std::cout << "Call ~AAA()! / this : [" << this << ']' << std::endl;
}
}
void ShowData(void)
{
if (this->data == nullptr)
std::cout << "data : " << std::endl;
else
std::cout << "data : " << this->data << std::endl;
}
};
AAA FuncNrvo(void)
{
AAA s("ssssssssssssssssssssssssssssss");
return s;
}
AAA FuncNrvoS(int a)
{
AAA s("ssssssssssssssssssssssssssssss");
AAA z("zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz");
if (a == 100)
{
return s;
}
else
{
return z;
}
}
AAA FuncRvo(void)
{
return AAA("ssssssssssssssssssssssssssssss");
}
AAA FuncRvoS(int a)
{
if (a == 100)
{
return AAA("ssssssssssssssssssssssssssssss");
}
else
{
return AAA("zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz");
}
}
int main(void)
{
std::cout << "1. 일반 생성자 호출" << std::endl;
{
AAA a = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
AAA b("bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
}
std::cout << "--- --- --- --- --- --- --- --- --- --- --- --- ---" << std::endl;
std::cout << "2. 복사 생성자 호출" << std::endl;
{
AAA a = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
AAA b("bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
AAA c = a;
AAA d(b);
}
std::cout << "--- --- --- --- --- --- --- --- --- --- --- --- ---" << std::endl;
std::cout << "3. 임시 변수 r-value의 생성 - 라인이 끝나면 소멸된다." << std::endl;
{
AAA("cccccccccccccccccccccccccccccc");
std::cout << "라인이 넘어감" << std::endl;
}
std::cout << "--- --- --- --- --- --- --- --- --- --- --- --- ---" << std::endl;
std::cout << "4. l value 에 r value 대입 - 생성과 동시에 초기화 및 라인이 끝났음에도 소멸되지 않음." << std::endl;
{
AAA e(AAA("dddddddddddddddddddddddddddddd"));
std::cout << "&e : " << &e << std::endl;
std::cout << "라인이 넘어감" << std::endl;
}
std::cout << "--- --- --- --- --- --- --- --- --- --- --- --- ---" << std::endl;
std::cout << "5. r-value를 const & 를 통해서 가리킴 - 라인이 끝났음에도 소멸되지 않음." << std::endl;
{
const AAA& f(AAA("eeeeeeeeeeeeeeeeeeeeeeeeeeeeee"));
std::cout << "&f : " << &f << std::endl;
std::cout << "라인이 넘어감" << std::endl;
}
std::cout << "--- --- --- --- --- --- --- --- --- --- --- --- ---" << std::endl;
std::cout << "6. FuncNrvo() 함수의 AAA 반환으로 생성과 동시에 초기화." << std::endl;
{
AAA g(FuncNrvo());
std::cout << "&g : " << &g << std::endl;
g.ShowData();
}
std::cout << "--- --- --- --- --- --- --- --- --- --- --- --- ---" << std::endl;
std::cout << "7. FuncNrvoS() 함수의 AAA 반환으로 생성과 동시에 초기화." << std::endl;
{
AAA h(FuncNrvoS(11));
std::cout << "&h : " << &h << std::endl;
h.ShowData();
}
std::cout << "--- --- --- --- --- --- --- --- --- --- --- --- ---" << std::endl;
std::cout << "8. l-value를 r-value화 하여 생성과 동시에 초기화." << std::endl;
{
AAA a = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
AAA i(std::move(a));
std::cout << "&i : " << &i << std::endl;
i.ShowData();
a.ShowData();
FuncNrvo();
std::cout << "라인이 넘어감" << std::endl;
}
std::cout << "--- --- --- --- --- --- --- --- --- --- --- --- ---" << std::endl;
std::cout << "10. 그냥 FuncNrvoS()만 호출" << std::endl;
{
FuncNrvoS(19);
std::cout << "라인이 넘어감" << std::endl;
}
std::cout << "--- --- --- --- --- --- --- --- --- --- --- --- ---" << std::endl;
std::cout << "11. 그냥 FuncRvo()만 호출" << std::endl;
{
FuncRvo();
std::cout << "라인이 넘어감" << std::endl;
}
std::cout << "--- --- --- --- --- --- --- --- --- --- --- --- ---" << std::endl;
std::cout << "12. 그냥 FuncRvoS()만 호출" << std::endl;
{
FuncRvoS(19);
std::cout << "라인이 넘어감" << std::endl;
}
std::cout << "--- --- --- --- --- --- --- --- --- --- --- --- ---" << std::endl;
std::cout << "13.FuncRvo()을 받으며 호출" << std::endl;
{
AAA j(FuncRvo());
std::cout << "&j : " << &j << std::endl;
std::cout << "라인이 넘어감" << std::endl;
}
std::cout << "--- --- --- --- --- --- --- --- --- --- --- --- ---" << std::endl;
std::cout << "14. FuncRvoS()을 받으며 호출" << std::endl;
{
AAA k(FuncRvoS(19));
std::cout << "&k : " << &k << std::endl;
std::cout << "라인이 넘어감" << std::endl;
}
std::cout << "--- --- --- --- --- --- --- --- --- --- --- --- ---" << std::endl;
// 복사 생성자를 호출하지 않으며, AAA(100)의 임시객체는 즉시 소멸하지도 않는다.
// -> e 자체를 AAA(100)으로 만들어진 객체로 취급
std::cout << "--- --- --- --- --- --- --- --- --- --- --- --- ---" << std::endl;
const int& lref = 100;
//lref = 101;
std::cout << lref << std::endl;
std::cout << "--------------------------" << std::endl;
int&& rref = 100;
rref = 101;
std::cout << rref << std::endl;
return 0;
}