1

まず、一般的な質問をさせてください。

  • C++ は、多くの機能を提供し、プログラマーが適切と考える方法で物事を行う際に最大限の柔軟性を提供することを目的とした言語のように思えます。言い換えれば、プログラマーがおそらく私が見た他のどの言語よりも多くの方法で自分自身を表現できる柔軟な言語です。これは正しいですか?

次に、特定のもの:

  • なぜ C++ は、オブジェクトが のみであるクラスの作成をサポートしていないように見えるのconstですか? つまり、constオブジェクト以外を作成しようとすると、コンパイル時にエラーが発生するクラスです。多くの場合、これは当然のことのように思えますが、C++ では許可されていません。この背後にある理由は何ですか? (確かに、私はすべてのメンバーを作成できますconstが、それはやや失敗です。)
4

5 に答える 5

5

最初の段落では、C ++がどのように柔軟であり、さまざまなプログラムを表現できるかについて詳しく説明しています。

2番目の段落では、C ++で、プログラマーが非常に厳しい制限を適用できない理由を尋ねています。これは、疑わしい利点があります(すべてのメンバーにマークを付けて、constほぼ同じ結果を達成できる場合)。

この二分法からそれぞれ独自の結論を導き出しましょう。:)

于 2012-11-28T13:32:02.937 に答える
4

オブジェクトが const しかないクラスの作成を C++ がサポートしていないように見えるのはなぜですか? つまり、const 以外のオブジェクトを作成しようとすると、コンパイル時にエラーが発生するクラスです。多くの場合、これは当然のことのように思えますが、C++ では許可されていません。この背後にある理由は何ですか?

頭に浮かぶ最初の質問は、すべてのオブジェクトがconst自然なことである型を持つ場合です。自然にimmutable な型があり、一部の言語ではできるだけ多くの型を不変にすることが推奨されていますが、それはすべてのオブジェクトが であることを強制することと同じではありませんconst

クラス設計では、メンバー関数のいずれかがオブジェクトの状態を変更して不変オブジェクトを実現するかどうかを制御するのは簡単です。カプセル化はその魔法を行い、変更関数を公開しない場合、型は不変であり、const. また、(追加の安全性が必要な場合) すべてのメンバーデータを修飾しconstて、独自のコードで独自の制約に違反しているかどうかをコンパイラに通知させることもできます。すべてのオブジェクトをconst暗黙的に強制すると、すべてのメンバー データが beconstにマークされ、非 const 関数がuselessになることに注意してください。

さまざまな方法でほとんどコストをかけずに高レベルの効果を達成できることを考えると、なぜ複雑な言語を付加価値なしでさらに複雑にするのでしょうか?

上記の質問はレトリックに見えるかもしれませんが、そうではありません。言語の拡張を検討する基準の 1 つは、投資収益率です。この機能なしでは不可能だったことが、この機能で何ができるようになるでしょうか? (つまり、これは有効な機能ですか?) 答えが何もない場合、次の質問は、現在の状態と比較して、この機能を使用するとプログラマーの生活がどれだけ簡単になるかということです。(機能を有効にしない場合、それらを追加する価値は何ですか?)

有効化カテゴリでは、例はrvalue -referencesになります。その言語機能がなければ、 Perfect-Forwardingmove-semanticsも実装できません。2 番目のカテゴリでは、ラムダを考慮することができます — ラムダなしでは実行できなかったラムダで実行できることは何もありません — その価値は、ユーザー コードを単純化することにあります (複雑にする必要があるコード: ファンクターを作成し、関数のすべてのメンバーを宣言します)。適切な型、初期化するコンストラクターを提供する — キャプチャ — メンバー…) しかし、コードはラムダを使用するとはるかに単純になります。ラムダに価値があることを Stroustrup に納得させるには、Sutter からかなりの議論が必要だったことに注意してください。

あなたの場合、あなたが求めているのは有効化機能ではなく、機能なしでユースケースをサポートするコストは十分に低いため、それをコア言語機能として提供することはできません。

于 2012-11-28T14:50:17.887 に答える
2

C++ 言語の設計の核心は、非常に少ない (多くの場合ゼロ) コストで抽象化を提供することです。クラスを使用することは、C で構造体と関連する関数を提供することよりも高価ではありませんが、コンパイラーは、クラスの意味上の利点が実現されるように、コードに制限を課すことができます。これは、テンプレート、参照、ラムダ、コピー/移動セマンティクス、文字列、I/O などにも当てはまります。使用しないものには料金はかかりません。

C++ のもう 1 つの重要な設計原則は、他の言語機能から簡単に構築できない言語機能や、作成者にとって有用な形式の抽象化を提供しない言語機能を C++ が提供しないことです。各言語機能は、完全に表現力豊かなプログラムを作成するために使用できる構成要素です。これにより、柔軟性が向上します。言語が探している機能を提供する場合、その柔軟性が低下します。constクライアントがオブジェクトをどのように使用するかに関係なく、オブジェクトの状態を維持したい場合は、オブジェクトのすべてのメンバーを作成する必要がありconstます。メンバーはオブジェクトの状態です。C++ は、完全にすべてを提供することを望んでいません。最小限のコストで完全に表現力豊かなコードを作成するために必要なツールを提供するだけです。

于 2012-11-28T13:41:16.063 に答える
0

クラスのインスタンスを として作成するだけconstです。これにより、すべての内部が確実になりますconst

例えばconst MY_TYPE obj;

于 2012-11-28T13:29:44.583 に答える