C++/C++ 11 14 17

R 레퍼런스 타입.

산과 나무 2017. 1. 30. 12:48

1. 깊은 복사를 대신 R-VALUE의 값을 복시하고, R-VALUE는 초기화.

2. 생성자와 R-VALUE 할당연산자를 구성해줘야 한다.


3. R-VALUE 레퍼런스 선언은 && 입니다.

class CA
{
    int* pValue;
public:
    CA()
    {
        pValue = NULL;
    }

    CA(CA& va)
    {
        if (this == &va) return;

        Alloc();
        *pValue = *va.pValue;
    }


    CA(CA&& va) :pValue(va.pValue)
    { 
        va.pValue = NULL;
    }
    CA& operator=(CA&& va)
    {
        pValue = va.pValue;
        va.pValue = NULL;
        return *this;
    }

    ~CA()
    {
        if (pValue)
        {
            delete pValue;
        }
    }


    void Alloc()
    {
        pValue = new int;
        *pValue = 100;
    }

};

CA GetValue()
{
    CA VALUE;
    VALUE.Alloc();
    return VALUE;
}

4. 상수는 호출 할 수 있지만, L-VALUE 인 경우, std::move 를 호출해야 한다. 

   void Test(int&& i)

   {   

   }


   Test(1) -> ok
   int a = 10;
   Test(a) -> failed
   Test(std::move(a)) ->ok