2010-04-20 4 views

답변

2

그렇지 않습니까?

class Foo 
{ 
    public Foo (Foo other) // copy ctor 
    { ... } 
} 

는하지만 어쩌면 내가 다른 규칙은 C에 적용 것에 대해 조금 녹슬 ++ (용어 복사 생성자이 만들어 낸 경우).

+0

C++ (C++ 11 이상)에서는 다음과 같이 복사 생성자를 기본값으로 설정할 수 있습니다. "Foo (Foo other) = default;"일반적으로 모든 필드 복사 생성자 (또는 기본 유형의 할당 int, float 및 pointers와 같음). 필드에 복사 생성자가 없으면 컴파일러는 불행하게도 폭탄을 터뜨릴 것입니다. – Doug

6

C#이 복사 생성자에 대한 아이디어를 어떤 식으로 지원합니까? 당신은 당신이 원하는만큼 복사 할 수있는 것보다 더 자유 롭습니다.

+4

+1 : C#에는 암시 적으로 정의 된 복사본 생성자가 없습니다.하지만 C#은 틀림없이 좋은 것보다 해를 끼치는 C++ 기능이므로 배운 교훈으로 인해 C#을 생략했다고 말할 수 있습니다. –

+0

관점에 따라 다르 겠지만 구조체 유형 클래스의 경우 보일러 플레이트 코드가 제거되었습니다. 거의 모든 언어 구성이 잘못된 손에서 잘못 사용될 수 있습니다. 그리고 C#은 C++과 Java의 완벽한 기능을 제공하여 잘 사용할 수 있습니다. bizzare에 대한 이유 중 일부는 기능적 언어의 등장으로 인해 C#에 영향을 미치지 않으며 구현하기가 매우 쉬운 로컬 불변의 로컬 변수와 같습니다. 오 잘. – Doug

28

은 기본 구현이이 아니기 때문에 언어에 내장되어 있지 않습니다.

복사 생성자 suffer from many of the same ambiguities as cloning. 예를 들어, 얕은 복사본을 만들지 또는 전체 복사본을 만들지 여부는 특정 상황에 따라 다릅니다.

Customer 속성이있는 Order 클래스가 있다고합시다. 복사 생성자가 새로운 고객을 만들거나 원래 인스턴스를 가리켜 야합니까? 아마 원래 인스턴스 -하지만 약 Order.Payment 은요?

악의적 인 복사본을 수행하려는 경우에도 생성자 (또는 비슷한 공장 방법)에 액세스 할 수 없기 때문에 모든 하위 개체를 만들지 못할 수도 있습니다.

충분하지 않은 경우 this article on Java Design Issues은 잘림 (truncation)과 같은 몇 가지 다른 문제를 강조 표시합니다.

+2

+1 내장 된 복사 생성자에 대해 합당한 기본 동작이 없다는 점을 강조합니다. 에 딱 맞다. –

+2

또한, C++과 같이 구축 된 경우에도 원하는대로 복제 할 수 있습니다. this._PrivateFieldForCustomer = source._PrivateFieldForCustomer; <- 복사 생성자를 호출합니다. –

+2

C++ 기본값은 복사 생성자를 사용하여 모든 기본 클래스와 멤버를 복사하는 것입니다. 항상 원하는 것은 아니지만 합리적인 기본 설정으로 간주합니다. –