C+ – ウィキペディア

before-content-x4

C ++
ISO C++ Logo.svg
基本データになります
パラダイム: MultiParadigms(一般的、命令的、オブジェクト指向、手続き、構造、機能)
公開年: 1983年
デザイナー: Bjarne Strooustrup
デベロッパー: Bjarne Strooustrup
現行版 C ++ 20 [初め] (2020年12月)
現在のVorabバージョン: C ++ 23 ()
タイピング: 静的(動的タイプテスト可能)、暗黙的に、強い
重要な実装: C ++ビルダー、GCC、MS VisualC ++、Intel C ++コンパイラ、Clang/LLVM
標準化: ISO/IEC 14882:1998、
ISO/IEC 14882:2003、
ISO/IEC TR 19768:2007、
ISO/IEC 14882:2011、
ISO/IEC 14882:2014 [2]
ISO/IEC 14882:2017 [3]
ISO/IEC 14882:2020 [4]
に影響を受けた: C、シミュラ、アルゴル68、CLU、メタ言語、そこに
影響を受けた: Ada 95、Chapel、C#、D、Go、Java、Nim、Perl、Php、Python [5] 、ヴァラ、錆、シード7
isocpp.org

C ++ ISOによって標準化されたプログラミング言語です。 1979年から、Bjarne Stroustupがプログラミング言語Cの拡張として開発しました。 C ++は、高レベルの抽象化で効率的なおよびマシンクロースプログラミングとプログラミングの両方を有効にします。この標準は、さまざまな実装が存在する標準ライブラリも定義します。

after-content-x4

C ++は、システムプログラミングとアプリケーションプログラミングで使用され、両方の分野で最も一般的なプログラミング言語の1つです。 [6]

Table of Contents

システムプログラミング [ 編集 | ソーステキストを編集します ]

システムプログラミングの典型的なアプリケーションの分野は、オペレーティングシステム、組み込みシステム、仮想マシン、ドライバー、信号プロセッサです。 C ++はしばしばここでその場所を取り上げます。これは以前はアセンブラー言語とプログラミング言語のみを予約していました。

アプリケーションプログラミング [ 編集 | ソーステキストを編集します ]

アプリケーションプログラミングでは、C ++が主に使用され、効率に対する高い需要が、技術的なフレームワーク条件を通じて指定されたパフォーマンス制限を可能な限り使用するために使用されます。 2000年から、C ++は、言語JavaとC#によってアプリケーションプログラミングのドメインから押し戻されました。

音声デザイン [ 編集 | ソーステキストを編集します ]

C ++言語は約60のキーワード(「言語コア」)のみを使用し、一部は異なるコンテキストにあります( 静的 デフォルト )数回使用します。 C ++標準ライブラリを介して、言語Cと同様に実際の機能を受信します。これは、重要な機能(配列、ベクトル、リストなど)とオペレーティングシステム(ioStream、fopen、exit、…)を教えます。アプリケーションの領域に応じて、他のライブラリとフレームワークが追加されます。 C ++は、ライブラリの開発のための言語救済に焦点を当てています。これは、典型的な問題に対する一般化されたメカニズムを支持し、言語に個別のソリューションを統合することはほとんどありません。

C ++の強度の1つは、簡単な実装の詳細を要約し、抽象的なコマンドの結果の背後に主に隠れている強力な言語エージェントとの効率的なマシンプログラミングの組み合わせです。テンプレートメタプログラミングは特に重要です。効率と抽象化のほとんど妥協のない組み合わせを可能にする手法です。

ただし、いくつかの設計上の決定もしばしば批判されます。

after-content-x4

資源管理 [ 編集 | ソーステキストを編集します ]

C ++にはゴミコレクションはありませんが、図書館を介してガベージコレクションを有効にするか、言語標準に追加する努力があります。 [7] [8] [9] Boehmストレージクリーニングも参照してください。

C(malloc/realloc/free)のメモリ管理を使用することができます。これは、C ++標準ライブラリなどのライブラリに低レベル関数を実装して、Cライブラリ関数にアクセスするために必要です。ただし、一般的にC ++コードは、緊急にアドバイスされています。 [十] 代わりに、提供されるコンテナクラスを使用して、C ++標準ライブラリによってメモリ管理を引き継ぐことが慣習です。

他のリソース、例えばB.ファイルハンドルまたはネットワークソケットは、通常、RAII原則を備えた独自のクラスでC ++で管理され、使用後に自動整理を確保します。
これは、多くの場合、特別な基本クラス/インターフェイスを実装する他のプログラミング言語で概念的に設計されています。 B. Javaの「オートクロー可能」またはC#の「Idisposable」。
他のプログラミング言語では、これらの非管理されていないリソースが、ガベージコレクターと併せてこれらのオブジェクトの寿命を管理するために、特別なハンドリング(たとえば、c#でキーワードを使用する」を必要とすることがよくあります。
C ++のメモリにはリソースとして特別なステータスがないため、C ++のRAIIベースの実装はこれらの問題の影響を受けにくくありません。オブジェクト寿命の正しい実装は、ここですべてのリソースのリリースを保証します。

参照がオブジェクトを持たない限り、参照は通常、オブジェクトへの参照に使用されます。 B.関数呼び出しのパラメーターとして。
動的に割り当てられたオブジェクトの所有を管理するために、通常、スマートポインターが使用され、破壊とストレージの承認を引き継ぎます。
標準的なライブラリは、ここでの所有物を厳密に区別しています。このポインターのみがsiquim_ptrにメモリを持っていますが、メモリを所有することは、shared_ptrのいくつかのポインターインスタンス間で共有できます。
技術的には、これは主にShared_ptrを使用したリファレンスカウントを使用しています。 [11]

不完全なオブジェクトの方向 [ 編集 | ソーステキストを編集します ]

プライベート要素の可視性 [ 編集 | ソーステキストを編集します ]

C ++では、通常、ヘッダーファイルに公開されているインターフェイスに属します。これにより、コンパイル期間中および期間中に使用する場所にオブジェクトの依存関係が作成されます。

これらの依存関係は、そのような特定の構造で使用できます pimpl-idiom 実装Idiomへのポインタ )、避けてください。クラスのプライベートフィールド( example_class )プライベートで前宣言された補助クラスに移動し、この補助クラスのオブジェクトへのポインターに移動しました( example_class :: Impl * empl_ptr )実際のクラスに残ります。実装クラスの定義は、パブリッククラスの実装で行われるため、クラスのユーザー(ヘッダーファイルのみを知っている)には見えません。補助クラスはポインターによってのみ参照されるため、プライベートフィールドのすべてのソーステキストの変更は透明のままであり、バイナリの互換性が保持されます。 [12番目]

不完全なカプセル [ 編集 | ソーステキストを編集します ]

C ++では、個々のオブジェクトのメモリ領域は、故意または偶発的な相互変化で保護されていません。

未定義の動作 [ 編集 | ソーステキストを編集します ]

一部の音声構造の動作は定義されていません。これは、標準がそのような場合に何が起こるかを指定したり推奨したりしないことを意味します。効果は、実装の依存関係(つまり、ターゲット計算機とコンパイラに応じて、コンストラクトが異なる動作をする可能性がある)から、無意味な結果またはプログラムの下落までセキュリティギャップに及びます。コンパイラのこれらの自由のいくつかは、コードの追加の最適化を可能にします。

異なる動作があります

  • 別のコンパイラ
  • さまざまなコンパイラバージョン
  • さまざまなアーキテクチャ(ARM、x86、x64)
  • さまざまな最適化設定(デバッグ、リリース、最適化)
  • 選択したコマンド、コールコンベンションなど。 a。 m。

未定義の動作を備えたコードパッセージのソースコードは、コンピレーション後に予期しない不条理な動作を示すことができます。このようにして、行われたチェックは遅すぎることは、空の無限のループに置き換えられた、アレイの無効なインデックスにアクセスする方法が最適化または研削されています。 [13] [14]

それは、無効ではないだけでなく、それが無効である未定義の行動を理解するために特に重要です プログラム全体 無効になり、もはやよく形のC ++を表しません。その理由は、いくつかのタイプの「未定義の動作」は、バッファーオーバーフローや無効な算術操作によって引き起こされたプロセッサフ​​ラグの意図的な変更が発生した場合、正しいプログラム部分を含む完全に異なるものに影響を与え、その動作に影響を与える可能性があり、次の計算に影響を与える可能性があるためです。

の例 未定義の動作

  • 署名された整数のオーバーフロー(たとえば、変換するときも 署名されていないint int ))
  • ゼロポインターインデント
  • 無効なインデックスを備えた配列アクセス
  • プッシュされるタイプのビット数が負または大きいスライド幅のスライド操作
  • 積分データ型を備えたゼロによる分割
  • から離れます 戻る – 戻り値を持つ関数内のスタッゲット(メイン関数 主要 唯一の例外を形成します)
  • 副作用は、式で数回変数を変更します( v [i] = i ++; )または引数リストで( f(i、i ++); )発生する(部分表現と機能的議論の評価順序は指定されていない)

一方では、結果として生じる非決定的な用語の動作は、特にプラットフォームの小さな変更の場合は、少なくともリスクとして分類されなければなりませんが、実際には明確な不利な点として分類する必要があります。一方、有効性チェックを省略できるため、より高速なプログラムが可能になり、コンパイラは定義として限界ケースを無視することでプログラムパーツを最適化することもよくあります。

しばしば知覚されない利点は、未定義の動作が非常に疑わしい構成要素で実際に発生するが、コンパイル中に必ずしも決定されていないという事実は、ある程度、または他の他の準最適なコードを禁止することです。

たとえば、2つの陽性整数の合計かどうかを確認する違法な方法があります

a {displaystyle a}

b {displaystyle b}

「int」のタイプ「int」の損失はなく、合計が大きいかどうかを確認します(オーバーフローがオーバーフローの場合、2補体算術によりほとんどのコンピューターで負の数が作成されます)。ただし、このようなレビューは、数学的な観点からは特に役立ちません。より良い(よりセマンティックな)アプローチは、

a + b n t _ m a バツ {displaystyle a+bleq mathrm {int_max}}

、それによって

n t _ m a バツ {displaystyle mathrm {int_max}}

数学的に有効な変換によると、「int」数で最大のものは

a n t _ m a バツ b {displaystyle aleq mathrm {int_max} -b}

使用する。 [15]

cとの互換性 [ 編集 | ソーステキストを編集します ]

プログラミング言語cの拡散に基づいて構築するために、C ++は1990年に従ってCの拡張として設計されました(ISO/IEC 9899:1990、C90とも呼ばれます)。

Cの強制性C ++との互換性は、いくつかの欠点を継続します。これには、時には理解が困難なC-Syntax、それぞれのプラットフォームに依存する言語のさまざまな詳細がある場合がある場合があります。

一部のC言語コンストラクトには、C ++のわずかに変更された意味または構文があるため、C ++プログラムとして翻訳するには、最初にCプログラムを調整する必要があります。 Cのさらなる変更は、1999年(ISO/IEC 9899:1999、別名C99)および2011年(ISO/IEC 9899:2011、別名C11)にC ++の最初の標準化の後に行われました。 C99の革新の一部は、2011年のC ++改訂で採用されました。一方、C ++ 11とも互換性がないC標準に新しい機能が追加されています。

詳細に言語特性 [ 編集 | ソーステキストを編集します ]

C ++は、ISO/IEC 9899:1990のように、プログラミング言語Cに基づいています。 Cで利用可能なオプションに加えて、C ++は、他のデータ型、新しいタイプの変更オプション、多重継承と仮想関数、例外的な処理、テンプレート(ステンシル)、名前室、オペレーターおよび機能的な名前の過負荷、参照、動的ストレージを管理するためのオペレーター、標準的なライブラリを管理するためのオペレーターの過負荷、参照者、クラスを提供します。

プログラムの例 [ 編集 | ソーステキストを編集します ]

次のソーステキストは、標準の出力電流、通常は端末に「Hello World!」という単純なC ++プログラムです。

#含む   int  主要 ()  {   std :: cout  <<  "こんにちは世界!"  <<  std :: endl ;   戻る  0 ;  }  

プリプロセッサの順序またはpre -processor -called #含む 通常、変数、タイプ、関数の宣言を含むヘッダーファイルを挿入します。 Cとは対照的に、C ++標準ライブラリのヘッダーにはファイル拡張子がありません。

ヘッダー C ++標準ライブラリの一部であり、とりわけ標準の入力電流を宣言します std :: cin 標準出力が流れます std :: cout std :: cerr C標準ライブラリから既知のオブジェクト用 stdin stdout Stiderr

主要() 各C ++プログラムのエントリポイントを表す機能です。プログラムは関数によって実行されます 主要() これにより、他の関数を呼び出すことができます。関数 主要() ただし、C ++プログラムでさえ、再帰的に呼び出されてはなりません。

標準には実装が必要です。関数の2つの署名 主要() サポートする:例のような関数パラメーターのないものと、ポインターに整数とポインターがあるものはありません char コマンドラインパラメーターにアクセスできるようにするために受け入れます(すべてのプログラムで必要ありません): int main(int argc、char ** argv) 。実装は、さらなる署名にも使用される場合があります 主要() ただし、サポートは誰もが返品タイプを返す必要があります int (整数)、つまり整数を返します。します 主要() C ++ – 実装の標準は値を規定していません、規定 0を返します。 受け入れるために。 主要() したがって、他にない場合は0があります 戻る – ステートメントが入手できます。 [16]

std :: cout クラスのインスタンスです STD :: BASIC_OSTREAM 、名前ルームのC ++標準ライブラリ全体のように std 位置した。名前の部屋で説明されているのは、エリアオペレーターで使用されます( :: )アドレス。

文字通りのキャラクターチェーンの出力 "こんにちは世界" オペレーターが引き継ぎます << 。キャラクターチェーンリテラルはタイプのC ++にあります 一定の文字からの配列 char const [n] )、これで n 最終ゼロ終端のストライキチェーン + 1の長さのように。 C ++の標準型変換以来 ポインターアレイの減衰 まあ - アレイの知られている暗黙的な変換 T [n] ポインターで t* 提供し、それを提供します char const [n] char const* 崩壊すると、過負荷のオペレーターが適合します レンプレート BASIC_OSTREAM &operator <<(std :: basic_ostream &、char const *); out それに応じて呼ばれます( オペレーター<<(std :: cout、 "Hello World!"); )そして、文字列を出力します。発行マニピュレーターを通じて std :: endl ラインマークが発行されます。

0を返します プログラムの実行が成功したというオペレーティングシステムを介して通話プログラムが伝えられている場合。

ファイルエンディング [ 編集 | ソーステキストを編集します ]

典型的なファイルエンディングは.c、.cc、.cpp、.cxx、 .C ++ 、.h、.hh、.hpp、.hxx、 .h ++ 、.ipp、.tpp、.ixx。

C ++ - コンパイラ [ 編集 | ソーステキストを編集します ]

C ++コンパイラの実装は複雑であると見なされます。 1998年の言語標準を完了した後、C ++コンパイラの言語が大部分がサポートされるまで数年かかりました。

最も一般的なC ++コンパイラには次のものがあります。

ビジュアルC ++
Microsoft Visual C ++に含まれるコンパイラは、Windowsオペレーティングシステムに最も広く普及しています。コミュニティエディションは、Microsoftを無料で提供しています。
GCC
G ++は、 GNUコンパイラコレクション (GCC); G ++はオープンで自由に利用できます。 G ++は、さまざまなオペレーティングシステム(UNIX、Linux、MacOS、Windows、Amigaosを含む)およびプロセッサプラットフォームをサポートしています。 GNU C ++ 1987年以来存在しているため、最も古いC ++コンパイラの1つです。 [17]
クラン
Clang、Clangは、Cross-Platform Compilerine-Frastructure LLVM用のフロントエンドです。これは、Apple独自の統合開発環境Xcodeでも使用されています。 [18] Clang/LLVMエコシステムでは、静的コード分析のためのいくつかのツールも作成されています。 B.「Clang-Tidy」および「Clang Format」。
Intel C ++コンパイラ
Intel C ++コンパイラは、EDGの前述のC ++フロントも使用します。 Intel C ++コンパイラ Operating Systems Windows、Linux、およびMacOの下にIntelプロセッサのマシンコードを作成します。それからそれから Intel C ++コンパイラ 製品は、Intelプロセッサのコマンドを特によく生産し、このプラットフォームに特に効率的なプログラムを作成します。 (Intelコンパイラのコンパイルも、通常、代替コンパイラのコンピレーションよりもAMDチップで速く実行されますが、対応する最適化フラグはIntelをブロックします。
Oracle Solaris Studio
Oracle Solaris Studioは、Oracleを無料で提供しています。 [19]
Coeau C ++
コモーC ++。コンパイラのいわゆる「フロントエンド」、つまり分析フェーズを実装した部分は、 エジソンデザイングループ (EDG)は、コンパイラフロントエンドの開発を専門とする開発され、C ++フロントエンドは他の多くの商用C ++コンパイラにも統合されています。 Comeauコンパイラもインターネットで試してみることができます。
ターボC ++
ターボC ++/C ++ビルダーを使用すると、別のコンパイラが利用できます。 [20]

無料の開発環境 [ 編集 | ソーステキストを編集します ]

独自の開発環境 [ 編集 | ソーステキストを編集します ]

Objective-C [ 編集 | ソーステキストを編集します ]

C ++は、オブジェクト指向のプログラミングを簡素化するプロパティを拡張するためにプログラミング言語Cを拡張する唯一のアプローチではありませんでした。 1980年代には、プログラミング言語Objective-Cが作成されました。これは、C ++とは対照的に、SimulaではなくSmallTalkに基づいて構文的に基づいていました。 Objective-Cの構文(Cスモリットトークの影響)は、C ++(Cは非常に独自の構文拡張機能でシミュラに影響を与えます)とは大きく異なります)。 1980年代の終わりに、Objective-Cが初めてNextStepで商業的に使用され、そこでは中心的なコンポーネントです。現在、プログラミングインターフェイスOpenStep(またはCocoa and Gnustep)およびiOSおよびMacOSオペレーティングシステムにも重要なアプリケーション領域があります。

JavaとC# [ 編集 | ソーステキストを編集します ]

プログラミング言語JavaとC#は、C ++などのCにも基づいて、同様の構文を持っています。 [21] また、オブジェクト指向であり、しばらくの間Typparametersをサポートしています。ただし、外部の類似点にもかかわらず、それらはC ++とはかなり異なります。

ジェネリック技術は、オブジェクト指向のプログラミングをTypparametersで補完するため、かつてコード化されたアルゴリズムのリサイクル可能性を向上させます。ただし、一般的なJava拡張機能はクラスにのみ適用できますが、プリミティブタイプまたはデータ定数には適用されません。対照的に、C#ジェネリック言語拡張機能には、プリミティブタイプも含まれます。ただし、これは、コンピレーション時間に合わせて調整されたC ++テンプレートを賢明に補充できますが、置き換えることはできないという用語でのジェネリックの拡張です。

特に一般的なプログラミングにより、C ++は強力なプログラミングツールになります。 JavaとC#のオブジェクト指向プログラミングは依然として中心的な抽象化メカニズムを表していますが、このタイプのプログラミングはC ++で減少しています。このようにして、深いクラスの階層は回避され、効率性とリソース消費の利益において、多くの場合、オブジェクト指向プログラミングの基本的なコンポーネントの1つであるPolymorphiaが最小限に抑えられています。

起源の歴史 [ 編集 | ソーステキストを編集します ]

新しいプログラミング言語のアイデアは、彼の博士論文の中で、プログラミング言語シミュラの経験を通じてストラウップアップするようになりました。 ケンブリッジ大学 。 Simulaは大規模なソフトウェアプロジェクトでの使用に適しているように見えましたが、言語の構造により、非常に効率的なプログラムを作成することが困難になりました。対照的に、効率的なプログラムはBCPL言語で書くことができますが、BCPLは再び大規模なプロジェクトには適していませんでした。

彼の博士論文の経験により、Strooustrupは、1979年の分散算術に関連してUNIXオペレーティングシステムコアによる調査の文脈でAT&T Bell Laboratoriesに拡張されました。Cはプログラミング言語Cに拡張されました。オペレーティングシステムがUNIXとして、Cにも大きな分布がありました。

最初の拡張機能の1つは、言語のデータCapsungenを含むクラスの概念でした 開始-67 主なモデルはそうでした。その後、派生クラスが追加されました。より厳しいタイプシステム、インライン関数、標準引数が追加されました。

ストロウストラップ中 Cクラス付きC (「クラス付き」)開発(後にC ++になりました)、彼も書いた cfront 、コンパイラ Cクラス付きC 中間結果としてCコードを最初に作成しました。の最初の商用バージョン cfront 1985年10月に登場。

1983年でした Cクラス付きC C ++ 改名。拡張機能は、機能的な名前と演算子の過負荷、仮想関数、参照、定数、変更可能なフリーメモリ管理、および改善されたタイプチェックでした。行の終わりにバインドされているコメントの可能性は、BCPLから取得されました( // )。

1985年には、C ++の最初のバージョンが登場しました。これは、その時点で言語がまだ標準化されていなかったため、重要な参照バージョンでした。 1989年には、C ++のバージョン2.0が登場しました。新しい継承、抽象クラス、静的要素関数、一定の要素関数、およびアクセスモデルの拡張は新しいものでした。 保護されています 。 1990年に本が出版されました 注釈付きC ++リファレンスマニュアル それは、その後の標準化プロセスの基礎として機能しました。

言語は比較的遅くなりました テンプレート 例外的な治療 名前の部屋 、 小説 タイプ変換 ブールのみんな 追加した。

言語C ++のさらなる開発の過程で、Cと比較して拡張された標準的なライブラリも作成されました。最初の追加はそれでした stream-i/o-bibliothek 、次のような従来のC関数の代替品 printf() scanf() 申し出。標準ライブラリの主要な拡張機能の1つは、後にHewlett-Packardで開発された標準テンプレートライブラリの大部分の統合を通じて行われました( STL )。

標準化 [ 編集 | ソーステキストを編集します ]

長年の仕事の後、1998年に言語C ++(ISO/IEC 14882:1998)の最終バージョンが最終的に標準化されました。振り返ってみると、このバージョンも言語のさらなるバージョンとして公開されました。 C ++ 98 呼び出されました。 2003年には、ISO/IEC 14882:2003が採用されました。これは、1998年の基準の修正であり、いくつかの誤解が削除され、いくつかの詳細がより明確に策定されました。このバージョンも口語的になります C ++ 03 呼び出されました。

2005年以降のプログラミング言語C ++のさらなる開発 [ 編集 | ソーステキストを編集します ]

急速に変化するコンピューターテクノロジーの現在の開発に遅れずについていくためだけでなく、よく知られている弱点を修復するために、C ++標準化委員会はC ++の次の主要な改訂を開発しました。 C ++ 0x それは省略され、数値シーケンスは、見た目の可能性の大まかな評価を示す必要があります。その後、2009年末まで発行日が不可能になった場合、非公式の名前はに変更されました C ++ 1x

C ++のさらなる開発の主な目標は、システムプログラミングとプログラムライブラリの作成の観点から改善でした。さらに、初心者向けの言語の学習を改善する必要があります。

2006年11月、2009年に完了の目標日が設定されました。 2009年7月、この任命は2010年に初期に変更されました。 2011年8月、改訂はISOによって満場一致で受け入れられました [22] 2011年10月11日にISO/IEC 14882:2011として公開されました。 [23] [24] 非公式には、バージョンは呼び出されます C ++ 11

言語コアの改善 [ 編集 | ソーステキストを編集します ]

C ++ 98は、プログラミングの典型的な問題領域、たとえば補助能力(スレッド)のサポートなど、特に追加のプロセッサ環境で使用するために言語の改訂を行うことなど、まだ十分にカバーしていませんでした。メモリモデルを導入することにより、解雇順序でより多くの曖昧さを溶解し、特定の場合に維持し、したがって最適化の範囲を作成するために、オンライン操作に対して言語の保証が決定されました。

より遠い言語拡張機能の1つには、結果タイプの派生とso -calledの派生の自動型派生も含まれていました R値参照 、その助けを借りて、既存のものの補足です コピー その後、オブジェクトからも 延期 コンテナや組み込みフィールドを介して、エリアベースのloops(foreach)だけでなく、実現できます。 [25]

プログラムライブラリの拡張 [ 編集 | ソーステキストを編集します ]

2006年4月、C ++標準化委員会は、1998年に定義されている現在有効なライブラリへの非規範的な追加であるいわゆる最初のテクニカルレポート(TR1)を発行しました。多くのコンパイラメーカーがTR1に製品を提供しました。

TR1で、u。正規表現、 [26] 別のインテリジェントな手、 [27] 焦点を絞る容器、 [28] 乱数ライブラリ、 [29] C ++メタプログラミングのエイズ、Tupel [30] 数値ライブラリと数学ライブラリ。 [最初に30] これらの拡張機能のほとんどは、ブーストライブラリから来ており、そこから最小限の変更で採用されました。さらに、1999年に改訂されたプログラミング言語C(C99)のライブラリ拡張はすべて、C ++に適合した形式に含まれていました。 [32]

数値および数学的ライブラリを除き、すべてのTR1拡張機能が言語標準C ++ 11に採用されました。スレッドをサポートするために別のライブラリも導入されました。

C ++ 11 [ 編集 | ソーステキストを編集します ]

ISO/IEC 14882:2011標準で、 C ++ 11 、抽出物のように、C ++では、多くの遠い革新的な革新が導入されました。

  • ラムダス(匿名関数)、 C ++ 11 他の言語の標準はすでに広く使用されており、特に機能プログラミングの分野で言語が拡大されています。
  • タイプの推論による緩和型処理は、キーワードを介して行われます 自動 (これはもはやメモリクラスの仕様ではありません)一方ではキーワード decltype 一方、(可能であれば、式の式のタイプをコンパイルする式のタイプを返します)。どちらのキーワードも、組み合わせの強さを示しています。たとえば、機能全体が、たとえばプログラマーが見るのが難しいリターンタイプです。たとえば、より複雑なクラスメプレート内でより便利に定義されているためです。
    レンプレート  < TypeName  工場 >  自動  Objectを作成します const  工場  作成者 ))   - >  decltype 作成者 MakeObject ())  {   戻る  作成者 MakeObject ();  }  
  • 厳密にタイプしました 列挙 s( 列挙クラス )名前の衝突の問題を削除し、暗黙のタイプのタイプの観点から誤差に対する感受性を制限します。
  • 変更された修正によるいわゆる「レンジベースのループ」 ために - ステーションは、これらのデータ型のオブジェクトを傷つけるときに多くのアプリケーションでイテレーターが余分になるようにコンテナと配列を操作しやすくします。
    #含む   #含む   #含む   使用  名前空間  std ;  空所  printNames const  ベクター < >&  名前 ))  {      for (const string& singleName: names)
            cout << singleName << endl;
    }
    
  • テンプレートからテンプレート上のコンサルティングクランプを使用できます。 地図 >>
  • さらに、Variadic(Multi -Digit)テンプレートの導入により、テンプレートの使用オプションの大規模な拡張が行われました。これらは、固定されていない数のテンプレート引数を有効にすることができます レンプレート クラスvariadicexampleclass; これにより、コードまたはアルゴリズムの構造とコード構造の広範なオプションと単純化が可能になります。さらに、他の多くの人と同様に、彼らは持っています C ++ 11 -Rasungenは、潜在能力をさらに制限するために、時にはエラーが発生し、堅牢ではないマクロの使用を使用する必要性を制限します。
  • いわゆるRValue参照の明示的な使いやすさにより、とりわけ、いわゆる動きのセマンティクスに基づいて、幅広いコード単純化、用語最適化、例外的なプログラミングに基づいています。 RValue参照により、いわゆるユニバーサル参照も導入されました。これにより、「完全な転送」という問題が堅牢で簡単に解決しやすくなります(「タイプ控除」によって溶解されたテンプレート構築物内のタイプの一貫した継続)が、さらなるテンプレートに溶解しました)。の採用前 C ++ 11 - スタートは少なくとも純粋に言語レベルでは不可能であり、問​​題の場合に応じて、問題で多かれ少なかれ自分自身を必要としました。
  • さらに、一部の機能はC11から撮影されました。たとえば、少なくとも64ビットの整数( 長い )または翻訳時の保証 static_assert (C11: _static_assert )。 [33]

コンピューティング時間とストレージスペースに影響を与える言語C ++のトピックはSO -Calledにありました テクニカルレポート ISO / IEC TR 18015:2006年に扱われます。 [34]

標準を導入し、比較的長い時点で、多くの一般的なコンパイラーは、いくつかの拡張機能を参照して完全にまたは誤ってサポートしていませんでした。この点で、たとえば、マイクロソフトは特に強い制限を示しました Visual C ++ 2012 。と Visual C ++ 2015 ただし、ほとんどすべての重要な主要な言語拡張が考慮されています。 [35] [36]

C ++ 14 [ 編集 | ソーステキストを編集します ]

標準ISO/IEC 14882:2014で説明されているC ++ 14、 [2] の可能な用途を拡張します 自動 decltype 、要件を弱めます constexpr ABは、変数テンプレートを定義できます(たとえば、異なる精度のタイプに応じて異なる精度でπのいくつかのバージョンを定義します)、バイナリリテラル(0B ...)を導入し、HOCH Commataを数字の分離サインとして導入し、一般的なラムダを許可し、ラムダキャプチャの表現を拡張し、属性を導きます。 非推奨 a。 [2]

さらに、標準ライブラリは、C ++ 11で「忘れられた」または「見落とされがち」であるいくつかの機能によって補完されました(例: std :: make_unique )そして、現在の多くの機能的宣言 constexpr Clarified、これにより、コンパイラがより積極的な最適化を可能にします。

開発段階では、C ++ 14も C ++ 1Y 以前にC ++ 0xとして言及されたバージョンの後継バージョンになることを示すために名前が付けられました。

C ++ 17 [ 編集 | ソーステキストを編集します ]

2017年3月、ISO-C ++委員会は、言語標準C ++ 17を技術的に完了しました。新しいバージョンの場合、タイプを含めることが含まれていました std :: byte 決めた。 [37] これは、メモリへのバイトウェイアクセス用に明示的に意図されています。新しい一般的なコンテナが導入されました: std ::任意 代替手段として 空所* 用語でタイプチェックを使用して、 std :: variant ランタイムテストでCから取られた組合の代替として STD ::オプション 、正確に1つの要素を含めることができるが、そうする必要はないコンテナ。

公式の別れまで、バージョンもそうでした C ++ 1Z 専用。 [38]

7月中旬の夏の会議の後、委員会の招集を担当するC ++の専門家ハーブ・サッターは彼のブログで明らかにされました [39] すでにC ++ 20の最初の計画。

C ++ 20 [ 編集 | ソーステキストを編集します ]

C ++ 20の最終バージョンは、2月に確定され、9月に確認された後、2020年12月にリリースされました。 [40]

  • 概念
  • 特定のイニシャル奏者(最初はC99)
  • [=、これ]ラムダス
  • パラメーターのテンプレートパラメーターリスト
  • 眠気ブレインは「宇宙船オペレーター」をマイットします。 オペレーター<=>
  • 昇格
  • Capsungenと短いコンパイル時間のモジュールシステム [41]
  • STD :: SprintおよびStringストリームの最新の代替品としてのフォーマット
  • std :: string_view(c ++ 17)の概念の任意のフィールドへのスパン拡張

C ++ 23/26 [ 編集 | ソーステキストを編集します ]

  • 反射
  • 執行者
  • パターンマッチング
  • ネットワーキング [42]

「C ++」という名前 [ 編集 | ソーステキストを編集します ]

C ++という名前は、従業員のストロウストラップであるRick Mascittiによる単語作成であり、1983年12月に初めて使用されました。名前は、前身Cと増分演算子の接続に由来します ++ これにより、変数の値が増加します(1つ増加)。 C ++の発明者、Bjarne Strooustrup、最初にC ++ "C with Classes"と呼ばれる Cクラス付きC )) [43]

多くの場合、言語に対する批判が表明されていることは、例えば、次のものが含まれます。

  • C ++は非常に複雑で、プログラミングが発生しやすいです。あなたはそれをうまく習得するために多くを学び、練習する必要があり、多くの機能は非常に複雑であると考えられています。 [44]
  • C ++もそうです 低レベル - ビルド;より高い評価言語(クラス、一般的なクラス/関数など)の多くの機能がありますが、重要であると認識されている重要なことはありません。 [7]
  • たとえば、ポインターで自由に作業する可能性があるため、C ++は迅速に考慮されますが、このパフォーマンスは、例外的な場合の今日の高速コンピューターシステムでのみ必要です。オペレーティングシステムなどを作ることは理にかなっていますが。 C ++で記述するには、ソフトウェアの点ではるかに安く、アプリケーションプログラムを高等言語で作成するのが簡単で、待機しやすく、それでも十分なパフォーマンスがあったからです。 [45]
  • C ++に関連する典型的なのは、Bjarne Strooustrupからの引用です。

「C ++では、足で自分自身を撃つのは難しいですが、そうするときは、足全体を吹き飛ばします。」

「C ++では、自分の足に自分自身を撃つことはより困難ですが、それをすると、足全体がなくなりました。」 [46]

つまり、C ++は最初にはるかに簡単になりますが、同時に慎重に使用する必要がある多くの手段を伴います。たとえば、動的メモリの割り当てにより、自動ストレージのリリースなしでストレージリークが発生する可能性があります。ポインターは、誤ったメモリ領域を参照して、隠された不正行為を生成できます(ポインターハンギング)。
  • Bjarne Strooustrup: C ++プログラミング言語:現在C ++ 11 。 Carl Hanser、2015、ISBN 978-3-446-43961-0(C ++の標準作業、Cの基本知識)。
  • Bjarne Strooustrup: C ++の設計と進化 。 Addison-Wesley、1994、ISBN 0-201-54330-3(本は、言語デザイナーによって書かれたC ++の開発と設計について説明しています)。
  • Bjarne Strooustrup: プログラミング - C ++を使用した原則と実践 。 Addison-Wesley、2008、ISBN 978-321-54372-1(プログラミングの紹介、テキサス大学A&Mのエントリープログラミングコースの標準作業)。
  • ハーブサッター: 例外的なC ++ 。第1版。 Addison-Wesley、2000、ISBN 3-8273-1711-8(既存のC ++知識の深化)。
  • Andrei Alexandrescu: 最新のC ++デザイン - 使用される一般的なプログラミングとデザインパターン 。第1版。 MITP-Verlag、2003、ISBN 3-8266-1347-3(C ++ - メタプログラミングの標準作業では、C ++の深い理解が必要です)。
  • ウルリッヒ・ブレイマン: C ++を学ぶ - それを専門的に適用 - ソリューションを使用する 。 4.改訂版。 Addison-Wesley、2015、ISBN 978-3-446-44346-4(C ++ - 大学環境からの紹介)。
  • Sibylle Schupp: コンセプトを使用したC ++の個別のタイプチェックの意味定義 。 (科学記事)。の: Journal of Object Technology バンド 8 いいえ。 5 、2009年、 S. 105–132 、doi: 10.5381/jot.2009.8.5.a2
wiktionary:c ++ - 意味の宣言、単語の起源、同義語、翻訳
  1. ISO/IEC 14882:2020プログラミング言語 - C ++ 2020年12月。
  2. a b c ISO/IEC 14882:2014 - 情報技術 - プログラミング言語-C ++。 の: www.iso.org。 2014年12月、 2018年9月22日にアクセス
  3. ISO/IEC 14882:2017 - プログラミング言語-C ++。 の: www.iso.org。 2017年12月、 2018年9月22日にアクセス
  4. ISO/IEC 14882:2020-プログラミング言語-C ++。 2020年12月、 2021年10月21日に取得
  5. 9.クラス - Python 3.6.4ドキュメント。 の: docs.python.org。 2018年5月17日にアクセス
  6. プログラミング言語ビーコン。 の: lextrait.com。 2018年1月21日にアクセス (英語)。
  7. a b Bjarne Strooustrup: C ++のごみ収集が可能であることを認める提案が可能です。 (PDF)1996、 2015年6月6日にアクセス (Englisch):「最近のC ++の最も大声で宣言された基本的な弱さは、自動ゴミコレクションがないことです。この批判は、C ++の評判を傷つけ、潜在的なユーザーを怖がらせ、C ++が実装言語として強力な競争相手であるアプリケーションの範囲を制限することです。多くのアプリケーションでは、自動ガベージコレクションは確かに非常に強力なツールであり、仕事に適したツールです。」
  8. ハンス-J。ボーム、マイク・スペルタス、クラーク・ネルソン: N2670:ゴミ収集とリーチ性ベースのリーク検出の最小限のサポート(改訂)。 の: openstd.org。 13. 2008年6月、 2018年1月21日にアクセス (英語)。
  9. C ++の透明なプログラマ監督のガベージコレクション (PDF; 156 kb)。
  10. Bjarne Strooustrup: C ++ - メモリリークに関するFAQ (英語); 2013年5月3日にアクセス。
  11. std :: cppreference.comのshared_ptr 、実装に関するセクションノート。 2020年6月5日にアクセス
  12. Dポインターイディオム。 Heise開発者について。
  13. 複数の割り当てによる未定義の動作。 記念 2014年8月22日から インターネットアーカイブ )、2014年8月20日にアクセス。
  14. スコット・マイヤーズ: C ++を効果的にプログラミングします。 Addison-Wesley、pp。22/23、43/44および46、 グーグルブック 、2014年8月20日にアクセス。
  15. C ++、abschnittの未定義の行動に関する神話とミスセプト 、2015年2月20日にアクセス(英語)。
  16. Bjarne StrooustrupのC ++スタイルとテクニックFAQ。 の: www.strostrup.com。 30. 2017年9月、 2018年9月22日にアクセス (英語)。
  17. Bjarne Strooustrup: 現実の世界での言語の進化:C ++ 1991–2006。 (PDF; 690 kb)。
  18. Clang:LLVMのC言語ファミリフロントエンド。 の: clang.llvm.org。 2018年9月22日にアクセス (英語)。
  19. Oracle Developer Studio。 の: www.oracle.com。 2018年9月22日にアクセス (英語)。
  20. ターボC ++コミュニティ。 の: www.turboexplorer.com。 2018年9月22日にアクセス (英語)。
  21. Java - ちょっとした歴史 Coler Peter Wasland、新しいハードまで、Abhaam: 一言ではC#:デスクトップクイックリファレンス 。第2版​​。 O’Reilly、2003、ISBN 978-0-596-00526-9。
  22. C ++ 11は全会一致で標準として想定されています。 Heise Online、2011年8月13日。
  23. ISO/IEC標準として公開された新しいC ++バージョン。 Heise Online、2011年10月11日。
  24. プログラミング言語:ISOはC ++ 11を公開します。 Golem.de、11。2011年10月。
  25. C ++ 11 - 新しいISO C ++標準。 の: www.strostrup.com。 2018年9月22日にアクセス (英語)。
  26. 標準的なライブラリに正規表現を追加する提案。 開かれた基準。 2003年3月3日(英語)。
  27. 図書館の技術レポートに汎用スマートポインターを追加する提案 開かれた基準。 2003年3月27日(英語)
  28. ハッシュテーブルを標準ライブラリに追加する提案。 開かれた基準。 2003年4月9日(英語)。
  29. 標準ライブラリに拡張可能な乱数機能を追加する提案。 開かれた基準。 2003年4月10日(英語)。
  30. 標準ライブラリにタプルタイプを追加するための提案。 (PDF; 164 kb)at 開かれた基準。 2002年11月8日(英語)。
  31. C ++標準ライブラリに数学的な特別な機能を追加する提案。 開かれた基準。 2003年2月24日。
  32. ISO/IEC JTC1/SC22/WG21 N1568。 開かれた基準 、2004年(英語)。
  33. B. Stroustrup: C ++ 11 FAQ
  34. C ++パフォーマンスに関するISOテクニカルレポート (PDF; 1.2 MB)
  35. MSDN: C ++ 11/14/17関数のサポート(最新のC ++) MicrosoftコンパイラによるC ++ 11/14/17機能のサポート
  36. GNUコンパイラコレクション: GCC 4.7の実験C ++ 11サポートのステータス GCCによるC ++ 11の機能のサポート
  37. プログラミング言語:C ++ 17は技術的に完成しました。 heise.de、 2017年7月17日に取得
  38. ClangのC ++サポート。 C ++ 17実装ステータス。 の: clang.llvm.org。 22. 2018年9月、 2018年9月22日にアクセス (英語)。
  39. 旅行レポート:夏のISO C ++標準会議(トロント)。 herbutter.com、 2017年7月17日に取得 (英語)。
  40. 14:00-17:00: ISO/IEC 14882:2020。 2022年1月31日にアクセス (英語)。
  41. C ++モジュールは、到着時にデッドである可能性があります。 の: vector-of-bool.github.io。 2019年5月21日にアクセス (英語)。
  42. R/CPP - 2019-02コナISO C ++委員会の旅行レポート(C ++ 20の設計が完了しました。C++ 20のモジュール、C ++ 20のコルーチン、リフレクションTS V1が公開されました。 2019年8月22日にアクセス (英語)。
  43. C ++はいつ発明されましたか? 記念 オリジナル 2011年9月26日から インターネットアーカイブ )) 情報: アーカイブリンクは自動的に使用されており、まだチェックされていません。指示に従ってオリジナルとアーカイブのリンクを確認してから、このメモを削除してください。 @初め @2 テンプレート:webachiv/iabot/www2.research.att.com (Inglisch) - FAQ-eintrag bei AT&Tラボの研究 ;ステータス:2011年7月4日。
  44. イアン・ジョイナー: C ++ ?? C ++の批判。 (PDF)1992年11月、 S. 27–29 2015年6月6日にアクセス (英語)。
  45. C ++の問題。 の: www.cododhorror.com。 2007年1月12日 2018年9月22日にアクセス (英語)。
  46. Bjarne StrooustrupのFAQ。あなたは本当にそれを言いましたか? の: www.strostrup.com。 2018年3月18日、 2018年9月22日にアクセス (英語)。
after-content-x4