編集。実際、最初の答えで私が言ったことは有効ですが、これが本当の理由です。
最初はCがありました。Cはオブジェクト指向ではありません(オブジェクト指向のアプローチをとることはできますが、それはあなたを助けたり、何かを強制したりしません)。
その後、C With Classesがあり、後にC ++に名前が変更されました。C ++はオブジェクト指向であるため、カプセル化を促進し、オブジェクトの不変を保証します。構築時、およびメソッドの最初と最後では、オブジェクトは有効な状態です。
これを行うための自然なことは、クラスが有効な状態で開始することを保証するために、常にコンストラクターを持たなければならないことを強制することです-コンストラクターがこれを保証するために何もする必要がない場合、空のコンストラクターがこの事実を文書化します。
しかし、C ++の目標は、可能な限りすべての有効なCプログラムが有効なC ++プログラムでもあるという点でCと互換性を持つことでした(もはやアクティブな目標ではなく、CからC ++への進化により、もはや保持されなくなりました。 )。
この1つの影響は、 struct
とのclass
。前者はCの方法(デフォルトではすべて公開)で行い、後者は適切なOOの方法で行います(デフォルトではすべて非公開です。開発者は公開したいものを積極的に公開します)。
もう1つは、C struct
にはコンストラクターがないためにコンストラクターを持つことができなかったCがC ++で有効であるためには、C ++の見方ではこれに意味がなければなりませんでした。したがって、コンストラクターがないと、不変条件を積極的に保証するというOOの慣行に反することになりますが、C ++はこれを、本体が空のように動作するデフォルトのパラメーターなしのコンストラクターがあることを意味すると解釈しました。
すべてのC structs
が有効なC ++ structs
になりました(つまり、C ++と同じでした)classes
と、すべて-メンバーと継承-パブリック)。外部から、単一のパラメーターなしのコンストラクターがあるかのように扱われました。
ただし、コンストラクタをclass
またはに配置した場合はstruct
、Cの方法ではなくC ++ / OOの方法で処理を行っていたため、デフォルトのコンストラクタは必要ありませんでした。
それは省略形として機能したため、互換性が他の方法では不可能だった場合でも人々はそれを使い続けました(Cにない他のC ++機能を使用していました)。
したがって、Javaが登場したとき(さまざまな方法でC ++に基づいて)、後でC#(さまざまな方法でC ++とJavaに基づいて)が生まれたとき、彼らはこのアプローチを、プログラマーがすでに慣れている可能性があるため維持しました。
Stroustrupはこれについて彼のC ++プログラミング言語で書いています。C++ のデザインと進化における言語の「なぜ」にもっと焦点を当てています。
===元の回答===
これが起こらなかったとしましょう。
パラメーターなしのコンストラクターが必要でないとしましょう。コンストラクターがないとクラスを意味のある状態にすることができないためです。実際、これはstruct
C#で発生する可能性のあるものです(ただし、C#ですべてゼロとnullを意味のある方法で使用できないstruct
場合は、非公開の最適化を使用することをお勧めします。の使用に関する設計上の欠陥struct
)。
クラスがその不変条件を保護できるようにするには、特別なremoveDefaultConstructor
キーワードが必要です。少なくとも、呼び出しコードがデフォルトを呼び出さないようにするために、パラメーターなしのプライベートコンストラクターを作成する必要があります。
これは言語をさらに複雑にします。それをしない方がいい。
全体として、コンストラクタを追加することでデフォルトを削除するのではなく、何もしないパラメータのないコンストラクタを追加するための構文上の砂糖として、コンストラクタがないことを考えるのが最善です。