2009-09-19 11 views
1

최근에 복사 생성자에 대한 매개 변수에 대한 인터뷰에서 질문을 받았습니다.
[편집] 복사 생성자 기능을 구현하는 C++ 언어의 디자이너로서 const 개체에 대한 const 포인터에 대해 상수 참조 매개 변수를 선택하는 이유는 무엇입니까?복사 생성자에 대한 매개 변수 선택

복사 생성자에서 아마도 의미가없는 NULL에 포인터를 할당 할 수 있기 때문에 포인터 변수가 독립 객체 (사실상 좋지는 않을 것입니다. 효율성의 용어) 반면에 참조는 실제 객체에 대한 별칭 일뿐입니다 (그러므로 객체를 전달하는 더 좋은 방법).
다른 아이디어가 있습니까?

+0

통찰력을 얻었습니다. 복사 생성자에서 원본 객체를 변경할 수 없으므로 const 참조를 사용해야합니다. 그러나 복사 생성자가 const 객체 형식에 대한 const 포인터를 사용한다면 객체의 사용자는 먼저 독립 객체 (const에 대한 const 포인터)를 선언 한 다음 객체의 주소로 초기화해야합니다. 매개 변수로서 const 포인터 임시 변수가 C++에서 허용되지 않기 때문에 우리는 복사가 필요하고 복사 생성자를 사용한다. 의미가 있습니까? – Ankur

답변

6

Stroustrup은 클래스가 기본 유형과 같아 졌기 때문에. 당신이 int 변수를 초기화 할 때 :

int x = 5; 
int y = x; // Why would you write int y = &x; ? 

일정 개체에 일정 포인터를 전달 단지 사용자 정의 유형 ++ 자들은 다음 원시 형처럼 작동하지 않는 경우, C에 C. 클래스에 가져온 어떤 C++과 일치하지 그들은 무엇인가?

C++로 프로그래밍하는 것이 참조없이 비참 해지는 또 다른 예는 연산자 오버로딩입니다. 당신이 작성해야 상상해 :

myclass myobj1, myobj2, myobj3; 
&myobj3 = &myobj1 + &myobj2; 
+0

매우 좋은 점! – Ankur

1

그것은 구문 편리합니다.

복사 생성자가 호출되는 가장 일반적인 경우는 매개 변수가 값으로 전달되거나 값으로 반환되는 경우입니다.

복사 생성자의 매개 변수가 참조가 아닌 포인터 인 경우 복사 생성자를 호출하기 위해 주소 연산자를 적용해야합니다. 그러면 어색 할 것입니다.

0

복사 생성자에서 포인터를 사용하지 않는 중요한 이유는 임시 값이 rvalues에 바인드되는 방식입니다. 포인터의 경우 임시로 포인터를 저장하고 정의되지 않은 동작으로 나중에 사용할 수 있습니다. 참조를 저장하고 참조하는 것이 더 쉽고 실제 값을 사용하는 것이 더 쉽습니다.

관련 문제