10

이이 같은 생성자 클래스를 만들 때 어떤 일이 제대로 이해하기 그냥 빨리 질문 :컴파일러 생성 생성자

class A 
{ 
    public: 
    A() {} 
}; 

내가 이미 정의되어 있기 때문에 디폴트 생성자가 생성되지 것을 알고 있지만 있습니다 컴파일러에 의해 생성 된 복사 및 할당 생성자 또는 다른 말로하면이 발생하지 않도록하려면 개인 복사 생성자 및 개인 할당 연산자를 선언해야합니까?

class A 
{ 
    private: 
    // needed to prevent automatic generation? 
    A(const A&); 
    A& operator=(const A&); 
    public: 
    A() {} 
}; 

답변

10

예. 복사 생성자, 대입 연산자 및 소멸자는 다른 생성자 및 연산자와 관계없이 항상 생성됩니다.

하나를 사용하지 않으려면 완벽합니다. 그것은 또한 아주 일반적입니다.

+0

을 숨길하지 않음 [부스트 : : noncopyable] (HTTP를 : // www가 .boost.org/doc/libs/1_55_0/libs/유틸리티/유틸리티 .htm # Class_noncopyable). (이 간단한 클래스를 추출하거나 직접 작성하여 원하는 곳 어디에서나 재사용 할 수 있습니다.) – TypeIA

13

예, 사용자가 기본 생성자를 선언하더라도 복사 생성자 및 복사 할당 연산자가 생성됩니다.

클래스 정의에서 고유 한 복사 생성자 또는 복사 할당 연산자를 각각 선언하면 해당 생성이 억제됩니다. 당신의 자신의 복사 생성자, 하나를 제공 컴파일러 모두를 가질 수 있음을

참고 :

struct A { 
    A() { } 
    A(A const&, int foo); 
}; // compiler declares a copy constructor now 

// make the second parameter have a default argument 
// now this constructor is a copy constructor too. 
inline A::A(A const&, int foo = 0) { 

} 

int main() { 
    A a; 
    A b = a; // ambiguity between compiler's one and our custom one! 
} 

표준 그러나 컴파일러는이 코드를 받아 들일 수 -하지만 효과가 정의되지 않은 동작을 가진 유사합니다 : 프로그램이 잘못 구성되었지만 해당 프로그램에 대해 경고/오류가 필요하지 않습니다. (초기 GCC 버전은이 코드를 거부하지 않고 최근 버전에서는이를 거부합니다).

+1

귀하의 게시물은 "평소와 같이"매우 유익합니다 :) –

2

복사 및 할당을 비활성화하려면 개인 복사 생성자 및 할당 연산자 (boost::noncopyable은 기성품입니다)가있는 클래스에서 상속하는 것이 좋습니다.

1) 반복적 인 타이핑이 적습니다.

2) 자체 문서화 (희망 사항).

3) 이러한 작업을 호출 할 수 없다는 것을 강하게 검사합니다 (클래스 자체 또는 친구도 복사 할 수 없으므로 컴파일러가 발생하고 링커 오류는 발생하지 않음). 당신이 복사/할당을 방지 확인할 수 있으며,을 사용하는 경우 비록

4), 기본 생성자 : 실제로

#include <boost/noncopyable.hpp> 

class X : boost::noncopyable 
{ 
}; 

int main() 
{ 
    X a, b;  //has default constructor 
    //X c(a); //but can't be copied 
    //a = b; //or assigned 
} 
관련 문제