편집하다. 사실, 첫 번째 답변에서 내가 말하는 것은 유효하지만 이것이 진정한 이유입니다. :
처음에는 C가있었습니다. C는 객체 지향적이지 않습니다 (OO 접근 방식을 취할 수는 있지만 도움이되지 않습니다).
그런 다음 C With Classes가 있었고 나중에 C ++로 이름이 바뀌 었습니다. C ++는 객체 지향적이므로 캡슐화를 장려하고 구성시 및 메소드 시작 및 종료시 객체가 유효한 상태에있게합니다.
이것과 관련된 자연스러운 일은 클래스가 항상 유효한 상태에서 시작되도록 생성자가 있어야한다는 것입니다. 생성자가 이것을 보장하기 위해 아무것도 할 필요가 없다면 빈 생성자는이 사실을 문서화합니다 .
그러나 C ++의 목표는 가능한 한 모든 유효한 C 프로그램도 유효한 C ++ 프로그램이었습니다 (더 이상 목표가 유효하지 않으며 C의 C ++ 로의 진화는 더 이상 보유하지 않음을 의미합니다). ).
이 중 하나 개 효과는 간 기능의 중복이었다 struct
및 class
. 전자는 C 방식으로 작업을 수행하고 (기본적으로 모든 것이 공개됨) 후자는 좋은 OO 방식으로 작업을 수행합니다 (기본적으로 비공개 인 경우 개발자는 원하는 것을 공개적으로 공개합니다).
다른 하나는 C struct
에 생성자가 없기 때문에 생성자를 가질 수없는 C가 C ++에서 유효하기 위해서는 C ++에서이를 보는 의미가 있어야한다는 것입니다. 따라서 생성자가없는 것은 변형을 적극적으로 보장하는 OO 관행에 위배되지만 C ++은 빈 본문이있는 것처럼 작동하는 기본 매개 변수가없는 생성자가 있음을 의미했습니다.
모든 C structs
는 이제 유효한 C ++이었습니다 structs
. (이것은 classes
마치 매개 변수가없는 단일 생성자가있는 것처럼 외부에서 모든 것을 처리하는 C ++ 과 동일하다는 것을 의미 합니다.
그러나 생성자를 class
or struct
에 넣은 경우 C 방식이 아닌 C ++ / OO 방식으로 작업을 수행했으며 기본 생성자가 필요하지 않았습니다.
간결한 역할을 했으므로 호환성이 불가능한 경우에도 사람들은 계속 사용했습니다 (C가 아닌 다른 C ++ 기능을 사용했습니다).
따라서 Java가 여러 가지 방법으로 C ++을 기반으로하고 나중에 C # (여러 가지 방법으로 C ++ 및 Java를 기반으로)을 도입했을 때, 이미 코더가 익숙한 것처럼이 접근법을 유지했습니다.
Stroustrup은 C ++ 프로그래밍 언어로 이에 대해 썼으며 C ++ 의 디자인과 진화 에서 언어의“왜”에 더 중점을 두었습니다 .
=== 원래 답변 ===
이것이 일어나지 않았다고 가정 해 봅시다.
클래스가없는 상태를 의미있는 상태로 만들 수 없기 때문에 매개 변수가없는 생성자를 원하지 않는다고 가정 해 봅시다. 실제로 이것은 struct
C #에서 발생할 수있는 일입니다 (그러나 C #에서 0을 null struct
로 의미있게 사용할 수 없다면 공개적으로 볼 수없는 최적화를 사용하는 것이 가장 좋습니다. struct
) 를 사용하여 디자인 결함 .
클래스가 불변을 보호 할 수있게하려면 특별한 removeDefaultConstructor
키워드 가 필요 합니다. 최소한 호출 코드가 기본값을 호출하지 않도록 개인 매개 변수없는 생성자를 만들어야합니다.
언어를 좀 더 복잡하게 만듭니다. 하지 않는 것이 좋습니다.
대체로 생성자를 추가하는 것으로 생각하지 않는 것이 가장 좋습니다. 아무것도하지 않는 매개 변수가없는 생성자를 추가하기 위해 생성자가없는 구문 설탕으로 생각하는 것이 좋습니다.