2014-07-21 14 views
1

C++ 11 표준에 따라 default 키워드를 사용하여 특수 멤버 함수를 기본값으로 선언 할 수 있습니다.C++에서 명시 적으로 선언 된 메서드

class Foo 
{ 
public: 
    Foo() = default; 
    Foo(const Foo& source) = default; 
    Foo(Foo&& source) = default; 
    ~Foo() = default; 
    Foo& operator=(const Foo& right) = default; 
    Foo& operator=(Foo&& right) = default; 
}; 

사용자 정의 구현이 필요하지 않은 경우 명시 적으로 기본값 또는 삭제 된 모든 메소드를 선언하는 것이 좋습니다. 예를 들어, 클래스에 대한 복사 생성자 및 복사 할당 연산자를 구현해야합니다. 컴파일러에서 제공하는 클래스를 볼 때마다 생각하지 않기 위해 다른 모든 특별 회원 함수를 default 또는 delete 키워드로 표시해야합니까?

+4

IMO, 그것은 순수한 잡음입니다. (좋은) C++ 프로그래머가 이미 알고있는 것에 아무 것도 추가하지 않습니다. –

+0

@Park Young-Bae가 대답 해 주시면 받아 들일 수 있습니까? –

답변

1

에 따라 다릅니다. 컴파일러가 언제 이러한 함수를 자동으로 생성할지 여부에 대한 규칙이 있습니다. 컴파일러가 그것을하지 않고 필요로하는 경우, 디폴트를 사용하거나 직접 구현하여 강제로 생성 할 수 있습니다. 컴파일러는 늘 기능을 생성하는 경우 (이 당신이 컴파일러의 설명서를 것에 참고하시기 바랍니다 전체 목록이 아닙니다)입니다

  • 인수 생성자가 선언되는 경우에는 기본 생성자가 생성되지 않습니다
  • 없이 이동 당신이 선언 생성자를 복사 할당 연산자 (그리고 비자 반대)

따라서, 이러한 경우에 당신은 당신이 그들이거야 것을 알고있는 경우 default를 사용하여 그들을 돌아 오게 할 수 있습니다를 복사 할 때 생성자와 이동 할당 연산자가 생성됩니다 어딘가에 있어야합니다. 그러나 대부분의 경우 컴파일러에서 처리하도록해야합니다. 이러한 함수 중 하나가 자동으로 구현되지 않으면 오류가 발생합니다.

P. Visual Studio는 아직 이동 생성자 및 이동 할당 연산자에 대해 defaultdelete을 지원하지 않습니다.

+1

OP가 이것을 알고 있다고 생각합니다. 그는 그렇게 할 필요가 전혀 없을 때 이러한 방법을 기본값으로 설정하거나 삭제하는 것이 좋은 습관인지 묻습니다. – juanchopanza

+0

@rashmatash 당신의 답변에 감사하지만, juanchopanza는 그의 가정과 절대적으로 정확합니다. 나는 메소드 생성 조건을 알고 있고 실제로 필요하지 않을 때 선언하는 것이 좋은 연습인지에 관심이있다 –

+0

또한 컴파일러가 결정하지도 않는다. 규칙은 언어 사양에 나와 있습니다. – juanchopanza

관련 문제