3

私は1か月でC++11の勉強を始めますが、C++03と比較してC++11にはどのような利点があるのでしょうか?

4

3 に答える 3

5

2つに絞る必要があるとすれば、「値の参照と可変個引数テンプレート」は、C++03よりもC++11の最も大幅な改善であると言えます。どちらも、本当にずっと可能であったはずのことを行うことができ、言語に非常に表現力を加えることができます。最後にunique_ptr、右辺値参照のおかげで移動セマンティクスを備えた適切なコンテナーを作成でき、両方の構造が調和して機能するため、コピー構造ではなく直接構造を使用できます。

template <typename ...Args>
void construct(void * p, Args &&... args)
{
    ::new (p) T(std::forward<Args>(args)...);
}

もう1つの大きな改善点は、同時実行(マルチスレッド)の標準化された記述を可能にする言語へのメモリモデルの組み込みです。

ただし、言語をより表現力豊かにし、以前は単純にできなかったことを実行できるようにする、小さな追加機能がたくさんあります。

  • brace-initializationを使用すると、クラスメンバー配列を初期化し、自動オブジェクトの値を作成できます。

  • イニシャライザリストを使用すると、コンテナを初期化できます。

  • 定数式のより良い概念。

  • クラスとユニオンのより適切に指定されたメモリレイアウト、および可能な限り最適化を可能にする「自明性」のきめ細かい概念。

  • ラムダ式とクロージャにより、アルゴリズムと関数のプログラミングがはるかに簡単で実行可能になります。

于 2012-08-06T20:05:49.330 に答える
3

CとC++は完全に異なる言語であるため、質問のその部分に答えても意味がありません。

C++からC++11に関しては、より優れたオブジェクト指向コードを作成するのに役立つ最新の機能が言語に追加されています。

ライブラリは、BOOSTやその他の場所で、時間をかけて開発されてきました。

  • スマートポインタ
  • 正規表現
  • ラムダ式
  • 自動変数

したがって、ほとんどの場合、コーディングをサポートするライブラリが増え、より多くの「標準」コードを使用して、より少ないユーザーコードを記述できるようになります。これは、デバッグが少なく、コーディングが高速であることを意味します。

注:これらの機能の多くは、一般的に優れたプログラミング手法を促進するためのものです。たとえば、スマートポインターは、R​​AII(Resource Allocation is Initialization)を使用して、動的に取得されたリソースが参照されなくなったときに解放されるようにするのに役立ちます。

C ++ 11を使用することは、すでに所有しているときに新しいフェラーリを入手するようなものです。古いものは良いですし、仕事をやり遂げますが、新しいものはより良く、同じコースをより安全にそしてより速く運転し、途中でもっと楽しくすることができる甘い新機能を持っています:)

于 2012-08-06T20:03:46.243 に答える
3

C ++ 11の目標は、C++が得意とするすべてのことを改善することでした。表現力、パフォーマンス、型の安全性、そして物事を改善するために、C++はそれほど得意ではありません。一貫性と学習のしやすさ。C ++ 11は、マルチスレッドなど、C++98が最初に標準化された後にさらに重要になったコンピューティングのトレンドのサポートも追加します。

パフォーマンスのために、C ++ 11は右辺値参照を追加します。これにより、C ++ 11コードは、C ++ 03で時々使用される回避策を読みにくく理解することなく、高価なコピーを回避できます。また、新しい機能はすべて、「使用しないものにお金を払わない」という格言に従い、C++のパフォーマンス機能を維持します。

C ++ 11は、可変個引数テンプレート、一般化された属性、ユーザー定義のリテラル、デフォルトの特殊関数など、表現力を高めるために多くの機能を追加します。また、C ++ 11を使用すると、静的アサーション、コンパイル時の式、テンプレート可能な型エイリアス、削除された特殊関数など、C++03で実行できる特定のことを簡単に表現できます。

型安全性のために、強く型付けされた列挙型、明示的な変換演算子、精度を失う変換を行わない初期化構文、nullptrキーワードがあります。

C ++ 11は多くの制限を取り除き、より一貫性があり、習得しやすくします。いくつかの例は、非静的データメンバーのクラス内初期化、コンストラクターの継承/委任、初期化子リスト、直角ブラケットの修正、関数テンプレートのデフォルトのテンプレート引数、列挙型前方宣言、無制限の和集合などです。それぞれがいくつかの古い機能を「置き換え」ます。つまり、新しいプログラマーは、始めるために学ぶ必要が少なくなります。


もともと、質問はCとの比較も求めていました。

C ++およびCに関しては、C ++ 11は、C99より前のCに基づく元のC ++標準(C ++ 98)以降にCに追加された機能を反映する多くの改善をもたらします。たとえば、C ++ 11は、C99のさまざまなマクロを追加しますlong long。拡張整数型の要件、および__func__事前定義された識別子。C ++ 11は、複素数のレイアウトを義務付け、C99の_Complex数の(推定)レイアウトと互換性を持たせるようになりました。C99のcompundリテラルの代わりに、C ++ 11の統一初期化構文など、Cに追加された機能の代わりに他の機能を使用できます。

于 2012-08-06T21:37:14.193 に答える