2016-10-31 3 views
2

나는 다음과 같은 한 클래스 :정의 명시 적 과부하 생성자 문제

class CLASS1 
{ 
     CLASS1(); 
     CLASS1(const CLASS1 &obj); 

    CLASS1 operator +(const CLASS1 &obj) { 
     CLASS1 srcObj; 
     // doing add stuff here 
      return srcObj; 
     } 

    void func() 
    { 
    CLASS1 boj = // some method which returns CLASS1 obj. 
    } 


    CLASS1& operator =(const CLASS1 &obj) { 
     // copy properties 
     } 
} 

확인이 잘 작동합니다. 그러나 잠시 후 암시 적 변환을 피하기 위해 클래스를 명시 적으로 만들기로 결정했습니다. 내가 명시 적으로 할당을 오버로드했습니다에도 불구하고,

class CLASS1 
{ 
     explicit CLASS1(); 
     explicit CLASS1(const CLASS1 &obj); 

    CLASS1 operator +(const CLASS1 &obj) { 
     CLASS1 srcObj; 
     // doing add stuff here 
      return srcObj;   // compiler gives non-matching errors 
    } 

    void func() { 
     CLASS1 boj = somemethods(); // compiler gives non-matching errors 
    } 

    CLASS1& operator =(const CLASS1 &obj) { 
     // copy properties 
     } 
} 

지금, 컴파일러는 제공하지 않습니다 '호출 할 일치하는 기능을 ...'오류 (위의 코드에 지정된) : 따라서, 나는 이런 식으로했습니다 운영자. 내 실수는 어디 갔지?

답변

2

값으로 개체를 반환하면 복사 생성자는 으로 암시 적으로이라고합니다. 암묵적으로 호출 할 수 없다고 말하면 오류가 발생합니다.

기본, 복사 또는 이동 생성자에 explicit을 사용하지 않아야합니다. 또는 하나 이상의 인수를 취하는 생성자의 경우. 단일의 인수를 취하는 생성자의 경우 (예외가있다).

1

기술적으로 말하면 메서드에서 개체를 반환 할 때 메서드 호출 외부에서받는 개체는 실제로 메서드 내부에서 선언 한 개체의 복사본입니다. 따라서 컴파일러는 메소드 객체에서 메소드 결과로 "내용을 전송"하는 허용 된 방법을 가져야합니다.

CLASS1(CLASS1&& obj); 

이 당신이 암시 적 변환을 금지 할 수 있도록 임시가 할 수있는 능력을 유지하면서 :에-방법 인스턴스가 더 이상 필요하기 때문에, 이동은 (예, 당신은 이동 생성자를 추가해야합니다) 가장 좋은 방법입니다 사물.

실생활에서 알 수있는 복사/이동은 RVO/NRVO에 의해 최적화 될 가능성이 높습니다.

관련 문제