[c++] 복사 및 스왑 이디엄이란 무엇입니까?


Answers

과제의 중심은 두 단계입니다. 즉, 객체의 이전 상태를 찢어 내고 새로운 객체를 다른 객체 상태의 사본으로 작성하는 것 입니다.

기본적으로 소멸자복사 생성자 가하는 일이므로 첫 번째 아이디어는 작업을 위임자에게 위임하는 것입니다. 그러나 파괴가 실패하지 않아야하기 때문에 건설이 진행되는 동안 우리는 실제로 반대 방향으로하고 싶습니다 . 먼저 건설 적인 부분을 수행하고 성공한 경우 파괴적인 부분을 수행하십시오 . 복사 및 스왑 (copy-and-swap) 관용법은이를 수행하는 방법입니다. 먼저 클래스의 복사 생성자를 호출하여 임시를 생성 한 다음 임시로 해당 데이터를 교체 한 다음 임시 소멸자가 이전 상태를 파괴하도록합니다.
swap() 은 결코 실패하지 않기 때문에 실패 할 수도있는 유일한 부분은 복사 생성입니다. 먼저 수행되고 실패 할 경우 대상 객체에서 아무 것도 변경되지 않습니다.

정제 된 형식에서 복사 및 스왑은 할당 연산자의 (비표준) 매개 변수를 초기화하여 복사를 수행함으로써 구현됩니다.

T& operator=(T tmp)
{
    this->swap(tmp);
    return *this;
}
Question

이 관용구는 무엇이며 언제 사용해야합니까? 어떤 문제가 해결됩니까? C ++ 11을 사용하면 관용어가 변경됩니까?

비록 그것이 여러 곳에서 언급되었지만, 우리는 단 하나의 "what is it"이라는 질문과 대답을 가지고 있지 않았습니다, 그래서 여기 있습니다. 이전에 언급 한 장소의 일부 목록은 다음과 같습니다.




이 대답은 위의 답변에 대한 추가 및 약간의 수정과 같습니다.

Visual Studio의 일부 버전 (및 기타 컴파일러)에는 실제로 성가신이며 의미가없는 버그가 있습니다. 따라서 다음과 같이 swap 함수를 선언하거나 정의하면 :

friend void swap(A& first, A& second) {

    std::swap(first.size, second.size);
    std::swap(first.arr, second.arr);

}

... swap 함수를 호출하면 컴파일러에서 소리를 지르겠습니다.

friend 함수가 호출되고이 객체가 매개 변수로 전달되는 것과 관련이 있습니다.

이 문제를 해결하는 방법은 friend 키워드를 사용하지 않고 swap 함수를 재정의하는 것입니다.

void swap(A& other) {

    std::swap(size, other.size);
    std::swap(arr, other.arr);

}

이번에는 swap 호출하고 other 넘겨 컴파일러를 행복하게 만들 수 있습니다.

결국, 당신은 2 개체를 교환하는 friend 기능을 사용할 필요 가 없습니다. 하나의 other 객체를 매개 변수로 가지는 멤버 함수를 swap 으로 만드는 것은 많은 의미가 있습니다.

this 객체에 이미 액세스 할 수 있으므로 매개 변수로 전달하는 것은 기술적으로 중복됩니다.






Related