C에서 복사 생성자의 일반적인 구문을 알고 + + 참조 걸립니다. 그러나 참조 대신 포인터 유형을 사용하면 어떻게 될까요? 복사 생성자에서 포인터 메카니즘으로 패스를 사용하지 않는 이유는 무엇입니까? 주요 단점은 무엇입니까?왜 우리는 C++의 복사 생성자에서 포인터에 의한 전달을 사용할 수 없습니까?
답변
참조로 전달하면 실제 객체가 복사 생성자로 전달되고 포인터는 NULL 값을 가질 수 있으며 생성자가 실패 할 수 있습니다.
기술적으로 포인터를 사용하는 생성자를 작성할 수 있습니다 (이 경우 기술적으로 복사 생성자는 아니지만 사양의 표현을 기반으로 함). 그러나 이렇게하면 주소 지정이 불가능한 결과가 사용되지 않습니다. 우리가 큰 수학 수업 (multiprecision)가 고려 : 당신은 여전히 객체의 const bigmath &
버전이 필요하므로
bigmath a = 14;
bigmath answer(a * 3);
당신은 표현 a * 3
의 주소를 취할 수 없습니다.
바트 (Bart)가 말했듯이, 그것은 또한 객체가 "적절한 객체"임을 보장합니다. 그러나 이것은 상처를 입지 않을 것입니다. 그러나 저에게는 위의 것이 더 강력한 주장입니다.
개체에 대해 선택한 생성자 유형이 실제로 클래스가 수행하고 나타내는 것에 따라 달라질 수 있습니다. 복사본이 분명히 "좋지"않은 개체가 있으며 bigmath
클래스와 같은 다른 경우가 있습니다. 복사 생성자가 확실히 좋은 점입니다. bigmath
클래스의 경우에는 long 정수, double 및 문자열을 사용하는 생성자가 필요할 수도 있습니다. 경우에 따라 참조가 필요하지 않을 수도 있습니다. 경우에 따라 const 참조를 갖는 것이 의미가 없습니다. 그리고 제가 말했던 것처럼 복사 생성자를 갖는 것이 의미가없는 경우도 있습니다.
일반적으로 참조 ptr
을 참조로 바꾸려면 *ptr
참조를 추가하십시오. 컴파일러는 (참조를 전달할 수 있도록) 주소를 사용하기 때문에이를 사용하기위한 추가 코드를 추가하지 않습니다. 그러나 편의상, 포인터가있는 클래스가 있고 그 클래스의 복사본을 만들고 싶다면 실제로 포인터를 사용하는 생성자를 사용하는 것이 좋습니다. 그게 어디 있을지, 내 머리 꼭대기에 있을지 모르겠다.
아니, 그럴 수 없었다. 복사 생성자가 아닙니다. 그 표준은 분명합니다. –
'const bigmath &'객체를 취하면 무엇이 컴파일되지 않습니까, 아니면 적절한 복사 생성자가 아닙니다. –
@MatsPetersson : 내 답변에 인용 된 표준 코드를 참조하십시오. 그것은'const bigmath '일 필요는 없지만 포인터는 확실히 환영받지 못합니다. –
표준에 따르면, 포인터를 복용 복사 생성자가 존재하지 않습니다
이포인터가 포함되어 있지 않다. 너무 멀리 언어 디자인에 대한 밀교 세부 사항을 탐구하지 않고, it's a semantic distinction that makes a lot of sense when you consider the syntactic differences between them.
[C++11: 12.8/2]
: 클래스X
위한 템플릿이 아닌 생성자 복사 생성자의 첫 번째 매개 변수 유형X&
,const X&
의 경우,volatile X&
또는const volatile X&
이고 다른 매개 변수가 없거나 다른 모든 매개 변수는 기본 인수 (8.3.6)를가집니다. 포인터를 나타내는 반면 간접 참조의 요점은, 오브젝트에 대한 별명 "가"하는 것이므로 는 [...]
원하는 생성자를 쓸 수 있으며 원하는 경우 포인터를 사용할 수 있지만 "복사 생성자"는 아닐 수 있습니다. 아마도 소유권 의미론에 관해서는 아마도 분명하지 않을 것이며, 틀에 얽매이지 않을 것입니다. 그리고 이상하게 보일 것입니다. 그래서 그것이 우리가하지 않는 이유입니다.
전례가 없습니다. 단지 3 년 전부터 C++에서 파일 스트림을 인스턴스화하는 유일한 방법 인이 생성자를 고려해보십시오.
explicit basic_ifstream(const char* s, ios_base::openmode mode = ios_base::in);
이 예제는 복사 생성자와 이동 생성자를 모두 포함하고 있기 때문에 오해의 소지가있다. –
@ T.C. 좋은 장소 –
참조 대신 포인터를 사용하는 생성자를 작성하는 데는 아무런 문제가 없습니다. 복사 생성자가 아닙니다. 이것은 포인터를 취하는 생성자입니다. "왜 복사 생성자에 대해 7 개의 문자열, 12 개의 정수 및 3 개의 벡터를 전달할 수 없습니까?"라는 질문을 할 수 있습니다. –
인도에서 인기있는 인터뷰 질문 :-) – Jagannath