2017-11-22 12 views
4

의 내가 같은 구성 요소라는 간단한 C++ 구성 요소가 있다고 가정 해 봅시다 : 난 보통 코드에서 발견C++ 클래스의 끝에 연산자를 두는 목적은 무엇입니까?

class Component { 
public: 
    explicit Component(int i) 
    : _integer(i) { 
    } 

    ~Component() { 
    } 

    private: 
    int _integer; 

    Component(const Component&); 
    Component& operator=(const Component&); 
}; 

나는이 개 마지막 지침을 읽어하지만 난 정말 이해가 안 돼요. 구성 요소의 올바른 사용을 위해 필수입니까?

+3

보통 복사의 ctor를 해제하는 C++ 98/03 트릭은 다음과 같습니다

현대 C에서

는 ++, 하나는 명시 적으로 그 기능을 삭제하여, 컴파일시 에러에 "정의되지 않은 기호"오류를 설정 할 수 있습니다 및 대입 연산자. C++ 11에서는 대신 = delete를 사용할 수 있습니다 (public 섹션에서도) – Alexander

+0

클래스의 끝과 같은 것이 없습니다. 중요한 것은 멤버가 선언 된 액세스 지정자입니다. – CinCout

답변

0

클래스의 개인 섹션에 복사 생성자 및 복사 할당 연산자의 선언을 배치하면 클래스의 객체를 복사 할 수 없게 만듭니다.

10

이렇게하면 operator=에 대한 오버로드가 선언됩니다. 연산자를 오버로드하면 대개 할당 표현식 (a = b)을 수행하는 방법을 제어 할 수 있습니다.

그러나이 경우 연산자가 마지막이지만 사적인 액세스 지정자에 속하는 것은 중요하지 않습니다. 즉, 외부 코드가 Component 개체의 할당 (또는 그 문제에 대한 복사 생성, 복사본이 존재하기 때문에)을 수행하지 못할 수 있음을 의미합니다.

클래스 내의 코드 (멤버 함수 내)는 construct를 할당 및 복사 할 수 있습니다. 그러나 그것이 가능하지 않을 것이라고 나는 말할 것이다. 이 두 가지 특수 멤버 함수를 private로 표시하고이를 정의하지 않으면 클래스의 복사를 비활성화하는 C++ 03 방법입니다. 컴파일러가 기본 복사 생성자와 대입 연산자를 합성하지 못하게하기 위해 선언해야했습니다.

Component(const Component&) = delete; 
Component& operator=(const Component&) = delete; 
+0

감사합니다. 항상 클래스의 복사를 비활성화 하시겠습니까? – klaus

+2

@klaus - 클래스에 따라 크게 달라집니다. 그래서 여기서 절대적인 조언을 줄 수는 없습니다. 그러나 논리가 무거운 클래스를 작성하면 기본적으로 복사를 비활성화하는 것이 좋습니다. 필요한 경우 나중에 언제든지 추가 할 수 있습니다. – StoryTeller

+0

다형 기본 클래스를 복사 (및 암시 적으로 이동)하는 것을 방지하는 것이 좋습니다. 이러한 객체는 종종 ID (주소 변경 만 가능) 및/또는 [슬라이스] (https : //en.wikipedia. org/wiki/Object_slicing)은 그 (것)들을 위해 유해하다. 기본 클래스에 하나 이상의 순수 가상 (즉,'virtual ... = 0;') 메소드가 있다면, 복사 할당 연산자를 삭제 된 것으로 선언하는 것으로 충분합니다 :'T & operator = (const T &) = delete;'. 그렇지 않으면 복사 생성자를 삭제 된 것으로 선언하십시오. 슬라이싱을 막고 싶다면, 대신에 보호 된 것으로 선언하고'= default'로 정의 할 수 있습니다. –