5

cctor, dtor 또는 op =을 클래스에 추가 할 때 엄지의 C++ 규칙을 알고 있으므로 모든 상황에서 클래스가 제대로 작동하도록 다른 두 클래스도 추가해야합니다.생성자, 소멸자 및 대입 연산자를 복사합니다. 언제 우리가 그들 모두를 필요로하지 않습니까?

3 개 모두를 제공 할 필요가없는 경우가 있습니까?

C++에서 클래스에 하나를 추가하면 모두 추가해야하는 이유는 무엇입니까?

EDIT1 : 당신이뿐만 아니라 그 중 일부를 필요로하지 않지만, 당신이 그들을 그렇게 당신이 그들을 개인 또는 보호 만들고 싶어하고 싶지 않을 때 당신은 예를 언급

. 그러나 빈 시체를 사용하더라도 코드에 코드를 작성해야합니다.

비어있는 본문이있는 가상 소멸자를 추가하여 클래스 다형성을 만들 때 나를 필요로하는 유일하게 유효한 이유. 그러나 소멸자의 몸에 무언가를 쓰자마자 무언가를 cctor와 op = body에 쓰는 것을 고려해야합니다.

3 가지 방법을 모두 쓸 필요가 없는데 예제를 찾고 있는데, 초보자가 클래스를 사용하고 있어도 클래스에 버그를 일으키지 않고 그 중 일부를 생략 할 수 있습니다. :)

답변

3

관찰 된 클래스 (다른 클래스에 수명을보고하는 클래스)에는 모든 생성자 및 소멸자가 필요하지만 op =는 필요하지 않습니다. C++은 프로그래머가 가장 잘 알고 있기 때문에 완전히 불필요하기 때문에 필요하지 않습니다.

또한 복사 할 수없는 클래스가있는 경우 소멸자를 원할 수 있지만 나머지 두 개는 필요하지 않을 수 있습니다.

+0

+1은 복사 할 수없는 유형을 언급합니다. –

+0

정말로 복사 할 수없는 유형으로 만들려면 cctor 및 op = private 또는 protected로 쓸 수 있습니다. – Calmarius

5

복사본 생성자 또는 할당 연산자가없는 소멸자를 사용하려는 경우는 다형성 클래스를 개발할 때입니다.이 경우 virtual 소멸자가 기본 클래스 포인터를 통해 할당 취소를 허용하게해야합니다. 이러한 클래스는 종종 "가상 복제"관용구를 용이하게하기 위해 복사 생성자를 지원합니다. 그러나 다형 클래스는 일반적으로 힙 할당 및 포인터를 통해서만 참조되므로 할당 연산자가 거의 없습니다.이 경우 직접 할당은 거의 항상 조각화로 이어집니다.

+1

슬라이싱을 방지하기 위해 추가 할 것이고 복사 생성자를 보호하는 것이 좋습니다. –

+0

다형성 클래스의 경우 op = private 또는 protected로 설정할 수 있습니다. – Calmarius

1

클래스에 포인터 또는 sth가 있으면이 코드를 모두 써야하므로 cctor 또는 op =에는 얕은 복사본이없고 dtor에는 메모리 누수가 없습니다.

이것은 모두 작성해야하는 경우이며 다른 답변은 다른 답변에 있습니다.

C++은 기본값을 쓰고 있기 때문에 모두 필요하지 않으며 neseccary가 아니기 때문에 모두 필요하지 않습니다.

+0

질문은 필요하지 않은 경우를 설명하는 것이 었습니다. –

1

일반적으로 액세스 권한을 변경하거나 소멸자 의 경우 가상으로 만듭니다. 개인 복사 생성자 또는 할당 연산자를 선언하는 것은 소멸자가 필요하지 않더라도 이러한 작업을 금지하는 고전적인 방법입니다. 클래스에서 파생하려면 언제든지 소멸자가 가상 ​​(또는 보호)되어야합니다. 이 동적으로 할당 된 인스턴스를 제외하고 싶다면 기존의 관용구는 소멸자를 private로 선언하고 함수를 구현하여 delete this 함수를 구현하여 객체를 제거하는 것입니다.

마지막으로 컴파일러에서 생성 된 버전은 인라인이므로 에 이러한 함수 중 하나를 선언하여 인라인되지 않도록 할 수 있습니다. (더 작은 메모리의 일에 이것은 종종 고려 사항이었습니다.)

관련 문제