2013-04-07 2 views
5

저는 이것이 불가능하다고 생각하지만 물어볼 수도 있습니다. 개인용 복사 생성자를 선언하고 여전히 기본 구현을 사용할 수 있습니까?복사 생성자를 비공개로 설정하고 기본 구현을 계속 사용할 수 있습니까?

배경 : 매우 큰 벡터를 가진 클래스가 있으며 멤버 함수 하나를 제외하고는 복사 생성자를 호출하고 싶지 않습니다. 표준 공개 사본을 사용하면 과 같이 쉽게 버그가 생길 수 있습니다. foreach(Type const& el,vectOfBigObjects) 대신 반복 (foreach(Type el,vectOfBigObjects)의 참조를 잊어 버렸습니다. 따라서 표준 복사 생성자를 유지하고 비공개로 만들고 싶습니다.

copy-ctors 정의를 다시 작성하지 않고도이 작업을 수행 할 수 있습니까?

답변

11

copy-ctors 정의를 다시 작성하지 않고도이 작업을 수행 할 수 있습니까?

C++ 11에서는 그렇습니다. 당신은 생성자를 선언하고 를 기본값으로 표시해야합니다 :

struct X 
{ 
    // ... 
private: 
    X(X const&) = default; 
}; 

이 암시 적으로 하나 생성과 같은 정의를했을 복사 생성자를 정의하지만, private 될 것입니다. 예 :

struct X 
{ 
    X() { } // Required because a user-declared constructor in 
      // the definition of X inhibits the implicit generation 
      // of a default constructor (even if the definition is 
      // defaulted!) 

    void foo() 
    { 
     // ... 
     X tmp = *this; // OK! 
     // ... 
    } 

private: 

    X(X const&) = default; // Default definition, accessible to 
          // member functions of X only! 
}; 

int main() 
{ 
    X x; 
    // X x2 = x; // ERROR if uncommented! 
} 

여기는 live example입니다.

클래스 정의 의 사용자 선언 생성자 (복사 생성자 포함)는 정의가 기본값 인 경우에도 기본 생성자의 암시 적 생성을 금지합니다. 이것이 위의 예에서 X의 기본 생성자를 명시 적으로 선언해야하는 이유입니다.

관련 문제