5

클래스 X -> 두 가지 방법으로 Y로 변환됩니다. 1) 생성자, 2) 변환 함수로 변환합니다.
단일 인수 생성자가 변환에 사용됨을 이해했습니다. 사양에 생성자에 의한 변환

:

내재적 선언 복사 생성자는 명시 적으로 생성자 아니다; 암시 적 타입 변환을 위해 호출 될 수 있습니다.

질문 :

그래서, 그 변환 만 단일 인수 생성자를 사용하지 의미뿐만 아니라 생성자를 복사? 그렇다면 어떤 시나리오가 사용됩니까? 샘플 코드 스 니펫?

질문이 근본이면 나에게 잘 어울려.

+1

복사 생성자는 단일 인수 생성자입니다. 하지만 형식을 변경하지 않으므로 누구나 "변환"이라고 부르는 이유를 모르겠습니다. –

+1

나는 너를 "베어"면 내 아내가 화가 나게 될 것이라고 확신한다. :-) –

+0

하하, Jerry, 지적 해 주셔서 고마워요. :) – Whoami

답변

1

copy-ctor이 (가) T(const T&) 또는 T(T&)으로 선언되었으므로 묵시적으로 선언 된 복사본 생성자는 변환에 사용할 수 없습니다.

draft n3337 par 12.8 C++ 표준. X의 각각에 직접 또는 가상 기본 클래스 B가 그의 첫번째 파라미터 복사 생성자 못한 - 경우

8 클래스 X에 대한 암시 적 선언 복사 생성자 형태 X : X (CONST X &)을 가질 것이다 const B & 또는 const 휘발성 B & 유형이고 X의 클래스 유형 M (또는 그 배열)이 인 X의 모든 비 정적 데이터 멤버의 경우 해당 클래스 유형마다 복사자가 있습니다. 매개 변수의 형식이 const M &이거나 const volatile M & .119 그렇지 않으면 암시 적으로 선언 D의 복사 생성자 의 형식을 갖 X : X (X &)

복사 C-토르 만 사용할 수있는 명시 적입니다

struct So 
{ 
}; 

int main() 
{ 
    So s = So(); 
} 

copy-ctor 경우 같은 코드를 사용할 수 있습니다 명시하지 않기 때문에 초기화는 다음과 같습니다. So s((So()));

+0

일반성을 위해 T에서 T 로의 변환을 호출 할 수 있습니다. –

+0

@ SergeyK. "할 수있다"는 "있는 것"과 동일합니다. 이 전환인가요? – curiousguy

+0

@curiousguy : 내 대답 –

3

복사 생성자는 가능한 경우 항상 사용됩니다. 복사 생성자는 동일한 유형에서만 "변환"되므로 완전한 의미의 변환이 아닙니다. 그러나 보편성을 위해 그것을 하나라고 부르는 것이 편리합니다.

변환 생성자에 대한 자세한 내용은 http://www.keithschwarz.com/cs106l/winter20072008/handouts/180_Conversion_Constructors.pdf을 참조하십시오.

+0

에서 .pdf를 확인하십시오. "_Copy 생성자는 명시 적 생성자가 아니므로 가능하면 사용됩니다. _"불가능한 경우 명시 적 생성자가 사용됩니다. – curiousguy

+0

@curiousguy : 그래서 그들은 꽤 똑같지 않습니까? –

1

암시 적 복사본 생성자는 컴파일러에서 작성하는 것입니다. 그것은 항상 당신이 원하는 것을하지 않더라도,이 const T&로 변환 연산자를 가지는 모든 객체에 내재적으로 복사 할 수 있다는 것을 의미한다 형태

T(const T&); 

있습니다. 이 작업을 트리거하는 가장 일반적인 방법은 파생 클래스에서 기본 클래스에 복사본을 만드는 것입니다. 사본이 원본과 동일한 유형이 아니며 일부 중요한 특성이나 동작을 잃어 버리기 때문에이를 객체 조각이라고합니다.

+3

항상 그렇지는 않습니다. 12.8 par 조항 8 n3337 초안. – ForEveR

+0

@ForEveR, 지적 해 주셔서 고맙습니다. 예외가 있다는 것을 몰랐습니다. 실용적인 사례가 표준을 읽는 것으로 어떤 것인지 상상하기가 힘듭니다. –

+1

@Mark : 기본적으로 클래스에'auto_ptr'이 포함되어 있다면 (왜'unique_ptr'이 추가 되었습니까?), 암시 적으로 생성 된 "복사 생성자"는 이동 의미를 갖습니다. –

2

그것은 기본적으로 당신이 할 수 있다는 것을 의미한다 :

복사 생성자가 컴파일 실패가 명시 적으로 표시 한 경우
struct A {}; 
A a; 
A b = a; 

. 구조체에 explicit A(A const &) {}을 추가하고 프로그램을 다시 컴파일하여 테스트 할 수 있습니다.

+0

전환입니까? – curiousguy