4

なぜ私はそれをすることができないのですか

class A {
  public:

    int x = 10;

  ...
};

そして私はそれをしなければなりませんか?

class A {
  public:

    int x;

  A(){
    x = 10;
    ...
  }

  ...
};

これは、C ++がCのような言語よりもタイプセーフにしようとしているためですか?他の理由がありますか?

4

3 に答える 3

5

これはタイプ セーフとは関係ありません。どちらの例も安全です。

言語を作成するときは、何が許可され、何が許可されないかを定義する必要があります。ブラックリストを書くことは終わりのない経験になるので、言語は通常ホワイトリスト方式で書かれ、可能なことをどんどん追加します。

ただし、結果を明確に比較検討せずに物事を許可するべきではありません。何か新しいことを許可したいときはいつでも、次のことを確認する必要があります。

  • 実装の容易さ
  • 他の既存の機能および既知の推定拡張機能との相互作用

さらに、それは言語を使いたい人にとって学ぶべきことがもっとあるということでもあります。

ただし、ここで求めていることは比較的簡単です。クラスでは、関数のデフォルト引数に対応するものと見なすことができます。これは、複数のコンストラクターを記述するときにデフォルト値の一貫性を保証する最も簡単な方法だったため、C++11 で採用されました。

0個人的には、C++11 を使用する場合、ローカル変数を宣言するときに初期化することをお勧めするのと同じように、すべての組み込み型をこの方法で初期化することをお勧めします (もし.

于 2012-10-06T10:08:11.910 に答える
3

警告:憶測が続きます。

C ++クラスは、C構造体に基づいており、いくつかの機能が追加されています。C構造体のメンバーは初期化子を持つことができません(構造体タイプのオブジェクトが作成されるたびにコードを実行する必要があるため、初期のCコンパイラーには複雑すぎると考えられていました)。

初期のC++(元々は「CwithClasses」と呼ばれていました)はコンストラクターを追加しました。これは、特定のタイプのオブジェクトが作成されるたびにコードを実行する必要があるメカニズムです。コンストラクターはメンバー初期化子が実行できるすべてのことを実行できるため、メンバー初期化子はおそらく不要と見なされていました。

しかし、あなたがあなたの質問で暗示しているように、それが厳密に必要でなくても、メンバー初期化子を持っていると便利でしょう。そして、新しい2011 ISO C ++標準はその機能を言語に追加したので、明らかにISOC++委員会はそれらが良い考えであることに同意しました。この機能により、言語の複雑さが増します(たとえば、初期化子とコンストラクターが実行される順序を管理する新しいルールが必要であり、その順序に依存するコードは混乱を招く可能性があります)。委員会は、利便性はさらに複雑にする価値があると判断しました。(私は同意すると思います。)

(C++言語の発明者であるBjarneStroustrupは、彼の初期の設計上の決定について説明した本「The Design and Evolution of C ++」を持っています。私は、彼がこの特定の問題について言及しているかどうかを(まだ)確認していません。)

概要:メンバー初期化子は便利ですが必須ではなく、言語機能として追加することを決定するのに時間がかかりました。

于 2012-10-06T18:13:09.697 に答える
2

私の知る限り、言語の純粋な単純さ。

言語をコンパクトにすることには一定の価値があります。あなたの最初の例を認めませんが、この言語は重大な制限を課していませんよね? その結果、より薄い本、より単純なコンパイラーが得られます。これらの利点は議論の余地があります。それらを適切なものと見なさないでください。私は個人的にコンパクトさに価値を見出しています。C の並外れた成功は、その単純さとコンパクトさに部分的に起因する可能性があります。

C++11 の導入により、状況は言語を知っている人がますます少なくなる方向に進んでいますsignificantly deep。これはマイナスの結果をもたらします。私は否定的なことだけを述べているわけではありません。

于 2012-10-06T07:52:04.217 に答える