C ++


C++

「CXX」はその他の使用法については、CXXを参照してください
C ++(/ ˌ S I ˌのP Lのʌ S PのL ʌ S /)は汎用プログラミング言語で作成されたビャーネ・ストロヴストルップの拡張として、Cプログラミング言語、または「有するCクラス」。言語は時間の経過とともに大幅に拡張され、最新のC ++には、低レベルのメモリ操作の機能に加えて、オブジェクト指向、汎用、および機能の機能が備わっています。ほとんどの場合、 コンパイル言語であり、Free Software Foundation、LLVM、Microsoft、Intel、Oracle、IBMなどの多くのベンダーがC ++コンパイラを提供しているため、多くのプラットフォームで利用できます。
C ++
標準C ++によって承認されたロゴ
パラダイム
マルチパラダイム:手続き型、機能型、オブジェクト指向、汎用、モジュラー
家族 C によって設計された
ビャーネ・ストロヴルプ
デベロッパー
ISO / IEC JTC1(合同技術委員会1)/ SC22(小委員会22) / WG21(ワーキンググループ21)
初登場
1985 ; 36年前 (1985)
安定リリース
C ++ 20(ISO / IEC 14882:2020) / 2020年12月15日 ; 12ヶ月前  (2020-12-15)
プレビューリリース
C ++ 23 /2021年10月23日 ; 59日前  (2021-10-23)
規律の入力
静的、主格、部分的に推測 OS クロスプラットフォーム
ファイル名拡張子
.C、.cc、.cpp、.cxx、.c ++、. h、.H、.hh、.hpp、.hxx、.h ++
Webサイト
isocpp .org
主な実装
GCC、LLVM Clang、Microsoft Visual C ++、Embarcadero C ++ Builder、Intel C ++コンパイラ、IBM XL C ++、EDG
に影響を受けた
Ada、 ALGOL 68、C、CLU、 ML、Mesa、 Modula-2、 Simula、Smalltalk
影響を受け
Ada 95、C#、 C99、Chapel、 Clojure、 D、Java、 JS ++、 Lua、Nim、 Objective-C ++、Perl、PHP、Python、 さび、Seed7
ウィキブックスでのC ++プログラミング
C ++は、システムプログラミングと、リソースに制約のある組み込みソフトウェアおよび大規模システムを対象として設計されており、その設計のハイライトとして、パフォーマンス、効率、および使用の柔軟性が C ++も、強みは、ソフトウェアインフラストラクチャとリソース制約のあるアプリケーションであることで、他の多くの状況で有用であることが分かっているなどのデスクトップアプリケーション、ビデオゲーム、サーバ(例えば、eコマース、ウェブ検索、またはデータベース)、パフォーマンスが重要なアプリケーション(電話スイッチやスペースプローブなど)。
C ++は、国際標準化機構(ISO)によって標準化されており、最新の標準バージョンは、2020年12月にISO / IEC 14882:2020(非公式にはC ++ 20として知られています)として承認され、ISOによって公開されています。 C ++プログラミング言語は、1998年にISO / IEC 14882: 1998として最初に標準化され、その後、C ++ 03、C ++ 11、C ++ 14、およびC ++ 17標準によって修正されました。現在のC ++ 20標準は、これらに取って代わり、新しい機能と拡張された標準ライブラリを備えています。1998年の最初の標準化の前に、C ++は、デンマークのコンピューター科学者BjarneStroustrupによって1979年からC言語の拡張としてベル研究所で開発されました。彼は、プログラム編成に高レベルの機能も提供する、Cに似た効率的で柔軟な言語を望んでいました。 2012年以来、C ++は3年間のリリーススケジュールであり、C ++ 23が次に計画されている標準です。

コンテンツ
1 歴史
1.1 語源 1.2 哲学 1.3 標準化 2.1 オブジェクトストレージ
2.1.1 静的ストレージ期間オブジェクト
2.1.2 スレッドストレージ期間オブジェクト
2.1.3 自動保存期間オブジェクト
2.1.4 動的ストレージ期間オブジェクト
2.2 テンプレート 2.3 オブジェクト
2.3.1 カプセル化
2.3.2 継承
2.4 演算子と演算子のオーバーロード 2.5 ポリモーフィズム
2.5.1 静的ポリモーフィズム
2.5.2 動的ポリモーフィズム
2.5.2.1 継承
2.5.2.2 仮想メンバー関数
2.62.6 ラムダ式 2.7 例外処理
3 標準ライブラリ
4 C ++コアガイドライン
5 互換性
5.1 C付き
6 批判
7 も参照してください
8 参考文献
9 参考文献
10 外部リンク

歴史
image"
  C ++の作成者であるBjarneStroustrupがAT&Tニュージャージーオフィスにいるc。2000
1979年、デンマークのコンピューター科学者であるBjarne Stroustrupは、「C ++の前身であるCwith Classes “”。 新しい言語を作成する動機は、博士論文のプログラミングにおけるStroustrupの経験に端を発しています。Stroustrupは、 Simulaに大規模なソフトウェア開発に非常に役立つ機能があることを発見しましたが、言語はBCPLは高速でしたが、大規模なソフトウェア開発には適さない低レベルでしたが、実用には遅すぎました。StroustrupがAT&T Bell Labsで働き始めたとき、分散コンピューティングに関してUNIX カーネルを分析する問題がありました。博士号を覚えています。経験上、StroustrupはC言語をSimulaのような機能で強化することを目指しました。 Cは、汎用で、高速で、移植性があり、広く使用されているために選択されました。CとSimulaの影響だけでなく、他の言語もこの新しい言語に影響を与えました。 ALGOL 68、 Ada、 CLU、 MLなどの言語。
当初、Stroustrupの「Cwith Classes」は、Cコンパイラ、Cpreに、クラス、派生クラス、強い型付け、インライン化、デフォルト引数などの機能を追加しました。
image
  2015年にパリで行われるC ++ 11機能に関するクイズ
1982年、Stroustrupは、C with Classesの後継の開発を開始しました。これは、他のいくつかの名前を経て、「C ++」(Cのインクリメント演算子)と名付けられました。仮想関数、関数名と演算子のオーバーロード、参照、定数、タイプセーフなフリーストアメモリ割り当て(新規/削除)、改善されたタイプチェック、2つの前方スラッシュ付きのBCPLスタイルの単一行コメントなどの新機能が追加されました() 。さらに、Stroustrupは、C ++用の新しいスタンドアロンコンパイラであるCfrontを開発しました。++//
1984年、Stroustrupは最初のストリーム入出力ライブラリを実装しました。名前付き出力関数ではなく出力演算子を提供するというアイデアは、Doug McIlroy (以前にUnixパイプを提案していた)によって提案されました。
1985年に、C ++プログラミング言語の初版がリリースされました。これは、まだ公式の標準がなかったため、この言語の最も信頼のおけるリファレンスになりました。 C ++の最初の商用実装は、同じ年の10月にリリースされました。
1989年にC ++ 2.0がリリースされ、1991年にC ++プログラミング言語の第2版​​が更新されました。 2.0の新機能には、多重継承、抽象クラス、静的メンバー関数、constメンバー関数、および保護されたメンバーが含まれます。1990年に、注釈付きC ++リファレンスマニュアルが発行されました。この作業は、将来の標準の基礎となりました。その後の機能の追加には、テンプレート、例外、名前空間、新しいキャスト、およびブール型が含まれていました。
1998年に言語を標準化したC ++ 98がリリースされ、2003年にマイナーアップデート(C ++ 03)がリリースされました。
C ++ 98の後、C ++は比較的ゆっくりと進化し、2011年にC ++ 11標準がリリースされ、多数の新機能が追加され、標準ライブラリがさらに拡張され、C ++プログラマーにより多くの機能が提供されました。2014年12月にリリースされたマイナーなC ++ 14アップデートの後、さまざまな新しい追加がC ++ 17に導入されました。 2020年2月に完成した後、 C ++ 20規格のドラフトが2020年9月4日に承認され、2020年12月15日に正式に公開されました。
2018年1月3日、Stroustrupは、「C ++プログラミング言語の概念化と開発に対して」、チャールズスタークドレーパーエンジニアリング賞の2018年の受賞者として発表されました。
2021年の時点で、C ++はTIOBEインデックスで4番目にランク付けされています。これは、プログラミング言語の人気の尺度であり、C、Java、Pythonに次ぐものです。

語源
Stroustrupによると、「名前はCからの変化の進化的性質を意味します」。この名前はリック・Mascitti(半ば1983)に入金されたとMascittiネーミングについて1992年に非公式に質問されたときに最初の月1983年に使用された、彼はそれがで与えられたことを示した冗談精神。名前は、Cさんから来演算子(インクリメント値の変数を)と、共通の命名規則強化されたコンピュータプログラムを示すために「+」を使用しての。++
C ++の開発期間中、この言語は、最終的な名前を取得する前は、「新しいC」および「クラス付きC」 と呼ばれていました。

哲学
C ++の生涯を通じて、C ++の開発と進化は、一連の原則によって導かれてきました。
それは実際の問題によって動かされなければならず、その機能は実際のプログラムですぐに役立つはずです。
すべての機能は実装可能である必要があります(そうするための合理的に明白な方法で)。
プログラマーは自由に独自のプログラミングスタイルを選択できる必要があり、そのスタイルはC ++で完全にサポートされている必要が
便利な機能を許可することは、C ++のあらゆる誤用を防ぐことよりも重要です。
プログラムを個別の明確な部分に編成するための機能を提供し、個別に開発された部分を組み合わせるための機能を提供する必要が
型システムの暗黙的な違反はありません(ただし、明示的な違反、つまりプログラマーによって明示的に要求された違反は許可されます)。
ユーザーが作成した型は、組み込み型と同じサポートとパフォーマンスを備えている必要が
未使用の機能は、作成された実行可能ファイルに悪影響を与えてはなりません(パフォーマンスの低下など)。
C ++の下に言語があってはなりません(アセンブリ言語を除く)。
C ++は、独自の互換性のない独自のプログラミング環境を促進するのではなく、他の既存のプログラミング言語と連携して動作する必要が
プログラマーの意図が不明な場合は、手動制御を提供してプログラマーがそれを指定できるようにします。

標準化
image
  1996年にストックホルムで開催されたC ++標準委員会の会議中のシーン
C ++標準
年 C ++標準 非公式の名前
1998年 ISO / IEC 14882:1998
C ++ 98
2003年 ISO / IEC 14882:2003
C ++ 03
2011 ISO / IEC 14882:2011
C ++ 11、C ++ 0x
2014年 ISO / IEC 14882:2014
C ++ 14、C ++ 1y
2017年 ISO / IEC 14882:2017
C ++ 17、C ++ 1z
2020 ISO / IEC 14882:2020
C ++ 20、C ++ 2a
C ++は、JTC1 / SC22 / WG21として知られるISOワーキンググループによって標準化されています。これまでに、C ++標準の6つのリビジョンを公開しており、現在、次のリビジョンであるC ++ 23に取り組んでいます。
1998年、ISOワーキンググループは初めてC ++をISO / IEC 14882:1998として標準化しました。これは非公式にC ++ 98として知られています。2003年には、ISO / IEC 14882:2003と呼ばれるC ++標準の新しいバージョンを公開しました。これにより、C ++ 98で特定された問題が修正されました。
標準の次のメジャーリビジョンは非公式に「C ++ 0x」と呼ばれていましたが、2011年までリリースされませんでした。 C ++ 11(14882:2011)には、コア言語と標準の両方に多くの追加が含まれていました。図書館。
2014年に、C ++ 14(C ++ 1yとも呼ばれます)がC ++ 11の小さな拡張機能としてリリースされ、主にバグ修正と小さな改善が行われました。ドラフト国際標準投票手順は2014年8月中旬に完了しました。
C ++ 14の後、非公式にC ++ 1zとして知られるメジャーリビジョンC ++ 17は、2017年7月中旬にISO C ++委員会によって完成され、2017年12月に承認および公開されました。
標準化プロセスの一環として、ISOはテクニカルレポートと仕様も公開しています。
ISO / IEC TR 18015:2006 組み込みシステムでのC ++の使用、およびC ++言語とライブラリ機能のパフォーマンスへの影響について
ISO / IEC TR 19768:2007 (C ++テクニカルレポート1とも呼ばれます)は、主にC ++ 11に統合されているライブラリ拡張機能に関するものです。
C ++ 17に統合された特別な数学関数に関するISO / IEC TR 29124:2010
10進浮動小数点演算に関するISO / IEC TR 24733:2011 、
C ++ 17に統合された標準ファイルシステムライブラリのISO / IEC TS 18822:2015
C ++ 17に統合された標準ライブラリアルゴリズムの並列バージョンに関するISO / IEC TS 19570:2015
ソフトウェアトランザクショナルメモリに関するISO / IEC TS 19841:2015 、
ISO / IEC TS 19568:2015 は、ライブラリ拡張の新しいセットであり、その一部はすでにC ++ 17に統合されています。
C ++の概念に関するISO / IEC TS 19217:2015 、C ++ 20に統合
並行性のためのライブラリ拡張に関するISO / IEC TS 19571:2016 、その一部はすでにC ++ 20に統合されています
汎用ライブラリ拡張の新しいセットに関するISO / IEC TS 19568:2017
C ++ 20に統合された範囲のライブラリ拡張に関するISO / IEC TS 21425:2017
コルーチンに関するISO / IEC TS 22277:2017 、C ++ 20に統合
ネットワーキングライブラリのISO / IEC TS 19216:2018
モジュール上のISO / IEC TS 21544:2018 、C ++ 20に統合
並列処理のためのライブラリ拡張の新しいセットに関するISO / IEC TS 19570:2018
リフレクション用の新しい拡張機能に関するISO / IEC TS 23619:2021
新しい一連の同時実行拡張機能など、より多くの技術仕様が開発中であり、承認待ちです。

言語
C ++言語には、主にCサブセットによって提供されるハードウェア機能の直接マッピングと、それらのマッピングに基づくオーバーヘッドなしの抽象化という2つの主要なコンポーネントがStroustrupは、C ++を「効率的でエレガントな抽象化を構築および使用するための軽量の抽象化プログラミング言語」と説明しています。そして「ハードウェアアクセスと抽象化の両方を提供することがC ++の基礎です。それを効率的に行うことが他の言語との違いです。」
C ++は、Cの構文のほとんどを継承します。以下は、C ++標準ライブラリストリーム機能を使用して標準出力にメッセージを書き込むBjarneStroustrupのバージョンのHelloworldプログラムです。
#include int main () {{ std :: cout << ""Hello、world! n "" ; }

オブジェクトストレージ
Cと同様に、C ++は、静的ストレージ期間オブジェクト、スレッドストレージ期間オブジェクト、自動ストレージ期間オブジェクト、および動的ストレージ期間オブジェクトの4種類のメモリ管理をサポートします。

静的ストレージ期間オブジェクト
静的ストレージ期間オブジェクトmain()は、入力前に作成され(以下の例外を参照)、main()終了後に作成の逆の順序で破棄されます。作成の正確な順序は、実装が実装を編成する方法にある程度の自由を与えるために、標準では指定されていません(ただし、以下にいくつかのルールが定義されています)。より正式には、このタイプのオブジェクトの寿命は「プログラムの期間中持続する」必要が
静的ストレージ期間オブジェクトは、2つのフェーズで初期化されます。まず、「静的初期化」を行い、すべての静的初期化を行った後、「動的初期化」を行います。静的初期化では、すべてのオブジェクトが最初にゼロで初期化されます。その後、定数初期化フェーズを持つすべてのオブジェクトは、定数式(つまり、リテラルまたはで初期化された変数)で初期化されconstexprます。標準では指定されていませんが、静的初期化フェーズはコンパイル時に完了し、実行可能ファイルのデータパーティションに保存できます。動的初期化には、コンストラクターまたは関数呼び出しを介して行われるすべてのオブジェクトの初期化が含まれます(constexprC ++ 11で関数が。でマークされている場合を除く)。動的初期化順序は、コンパイル単位(つまり同じファイル)内の宣言の順序として定義されます。コンパイル単位間の初期化の順序については保証されません。

スレッドストレージ期間オブジェクト
このタイプの変数は、静的ストレージ期間オブジェクトと非常によく似ています。主な違いは、作成時間はスレッド作成の直前であり、スレッドが結合された後に破棄が行われることです。

自動保存期間オブジェクト
C ++で最も一般的な変数タイプは、関数またはブロック内のローカル変数と一時変数です。自動変数に関する一般的な機能は、変数のスコープに制限された有効期間があることです。それらは、宣言の時点で作成され、潜在的に初期化され(詳細については以下を参照)、スコープが残されたときに作成の逆の順序で破棄されます。これは、スタックへの割り当てによって実装されます。
ローカル変数は、実行ポイントが宣言ポイントを通過するときに作成されます。変数にコンストラクターまたは初期化子がある場合、これはオブジェクトの初期状態を定義するために使用されます。ローカル変数は、それらが宣言されているローカルブロックまたは関数が閉じられると破棄されます。ローカル変数のC ++デストラクタは、オブジェクトの有効期間の終わりに呼び出され、C ++で広く使用されているRAIIと呼ばれる自動リソース管理の分野を可能にします。
メンバー変数は、親オブジェクトが作成されるときに作成されます。配列メンバーは、0から配列の最後のメンバーまで順番に初期化されます。親オブジェクトが作成の逆の順序で破棄されると、メンバー変数は破棄されます。つまり、親が「自動オブジェクト」である場合、スコープ外になると破棄され、すべてのメンバーが破棄されます。
一時変数は、式の評価の結果として作成され、式を含むステートメントが完全に評価されると破棄されます(通常;はステートメントの最後にあります)。

動的ストレージ期間オブジェクト
新規および削除(C ++)
これらのオブジェクトには動的な寿命があり、への呼び出しで直接作成したり、への呼び出しで明示的に破棄したりできます。 C ++はCからのともサポートしていますが、これらはとと互換性がありません。を使用すると、割り当てられたメモリにアドレスが返されます。C ++コアガイドラインは、C ++ 11で導入された単一所有権および参照カウント複数所有権を介して、スマートポインターを優先して動的オブジェクトを作成するために直接使用しないようにアドバイスしています。newdeletemallocfreenewdeletenewnewmake_uniquemake_shared

参照:メタプログラミングと
ジェネリックプログラミング
C ++テンプレートは、ジェネリックプログラミングを可能にします。C ++は、関数、クラス、エイリアス、および変数テンプレートをサポートします。テンプレートは、タイプ、コンパイル時定数、およびその他のテンプレートによってパラメーター化できます。テンプレートは、コンパイル時にインスタンス化によって実装されます。テンプレートをインスタンス化するために、コンパイラはテンプレートのパラメータを特定の引数に置き換えて、具体的な関数またはクラスインスタンスを生成します。一部の置換は不可能です。これらは、「置換の失敗はエラーではありません」(SFINAE)というフレーズで説明されている過負荷解決ポリシーによって排除されます。テンプレートは、ジェネリックプログラミング、テンプレートメタプログラミング、およびコードの最適化に使用できる強力なツールですが、この能力はコストを意味します。テンプレートを使用すると、テンプレートのインスタンス化ごとにテンプレートコードのコピーが生成されるため、コードサイズが大きくなる可能性がテンプレート引数のセットごとに1つですが、これは、コードを手動で記述した場合に生成されるコードと同じかそれより少ない量です。これは、コンパイル時に型が消去され、単一のテンプレート本体が保持される他の言語(Javaなど)で見られる実行時ジェネリックとは対照的です。はマクロとは異なります。これらのコンパイル時の言語機能はどちらも条件付きコンパイルを可能にしますが、テンプレートは字句置換に制限されません。テンプレートは、コンパニオン言語のセマンティクスと型システム、およびすべてのコンパイル時の型定義を認識しており、厳密に型チェックされたパラメーターの評価に基づくプログラムによるフロー制御を含む高レベルの操作を実行できます。マクロは、事前に決定された基準に基づいてコンパイルを条件付きで制御できますが、新しいタイプをインスタンス化したり、再帰したり、タイプ評価を実行したりすることはできず、事実上、コンパイル前のテキスト置換とテキストの包含/除外に制限されます。つまり、マクロは事前定義されたシンボルに基づいてコンパイルフローを制御できますが、テンプレートとは異なり、新しいシンボルを個別にインスタンス化することはできません。テンプレートは、静的ポリモーフィズム(以下を参照)およびジェネリックプログラミングのためのツールです。
さらに、テンプレートはチューリング完全であるC ++のコンパイル時メカニズムです。つまり、コンピュータープログラムで表現できる計算は、実行前にテンプレートメタプログラムで何らかの形で計算できます。
要約すると、テンプレートは、インスタンス化に使用される特定の引数の知識がなくても記述された、コンパイル時にパラメーター化された関数またはクラスです。インスタンス化後、結果のコードは、渡された引数用に特別に記述されたコードと同等です。このように、テンプレートは、抽象化によってパフォーマンスを犠牲にすることなく、関数とクラス(テンプレートにエンコードされている)の一般的で広く適用可能な側面を特定の側面(テンプレートパラメーターにエンコードされている)から切り離す方法を提供します。

オブジェクト
C ++クラス
C ++は、オブジェクト指向プログラミング(OOP)機能をCに導入します。クラスを提供します。クラスは、OOP(および一部の非OOP)言語に一般的に存在する4つの機能(抽象化、カプセル化、継承、およびポリモーフィズム)を提供します。他のプログラミング言語のクラスと比較したC ++クラスの際立った特徴の1つは、決定論的デストラクタのサポートです。これにより、リソース取得は初期化(RAII)の概念がサポートされます。

カプセル化
カプセル化とは、データ構造と演算子が意図したとおりに使用されるようにし、開発者が使用モデルをより明確にするために情報を隠すことです。C ++は、クラスと関数を主要なカプセル化メカニズムとして定義する機能を提供します。クラス内で、メンバーをパブリック、プロテクト、またはプライベートとして宣言して、カプセル化を明示的に適用できます。クラスのパブリックメンバーは、どの関数にもアクセスできます。プライベートメンバーは、そのクラスのメンバーである関数と、クラスによって明示的にアクセス許可が付与されている関数およびクラス(「フレンド」)にのみアクセスできます。保護されたメンバーは、クラス自体とすべての友達に加えて、クラスから継承するクラスのメンバーにアクセスできます。
オブジェクト指向の原則により、型の内部表現にアクセスするすべての関数のみがカプセル化されます。C ++は、メンバー関数とフレンド関数を介してこの原則をサポートしていますが、強制しプログラマーは、型の表現の一部またはすべてをパブリックとして宣言でき、パブリックエンティティを型の表現の一部ではないようにすることができます。したがって、C ++は、オブジェクト指向プログラミングだけでなく、モジュラープログラミングなどの他の分解パラダイムもサポートします。
一般に、すべてのデータをプライベートまたは保護し、クラスのユーザーの最小限のインターフェイスの一部である関数のみをパブリックにすることをお勧めします。これにより、データ実装の詳細を隠すことができるため、設計者は、インターフェイスを変更することなく、後で実装を根本的に変更できます。

継承
継承により、1つのデータ型が他のデータ型のプロパティを取得できます。基本クラスからの継承は、パブリック、保護、またはプライベートとして宣言できます。このアクセス指定子は、無関係の派生クラスが基本クラスの継承されたパブリックメンバーと保護されたメンバーにアクセスできるかどうかを決定します。パブリック継承のみが、通常「継承」が意味するものに対応します。他の2つの形式は、それほど頻繁には使用されません。アクセス指定子を省略した場合、「クラス」はプライベートに継承し、「構造体」はパブリックに継承します。基本クラスは仮想として宣言できます。これは仮想継承と呼ばれます。仮想継承により、継承グラフに基本クラスのインスタンスが1つだけ存在するようになり、多重継承のあいまいさの問題の一部が回避されます。
多重継承はC ++の機能であり、クラスを複数の基本クラスから派生させることができます。これにより、より複雑な継承関係が可能になります。たとえば、「Flying Cat」クラスは、「Cat」と「FlyingMammal」の両方から継承できます。C#やJavaなどの他の言語は、基本クラスの数を1つに制限しながら、複数のインターフェイスの継承を許可することで、同様のことを実現します(ただし、より制限されます)(インターフェイスは、クラスとは異なり、メンバー関数の宣言のみを提供し、実装やメンバーは提供しません)データ)。C#やJavaのようなインターフェイスは、C ++では、純粋仮想関数のみを含むクラスとして定義できます。これは、抽象基本クラスまたは「ABC」と呼ばれることがよくこのような抽象基本クラスのメンバー関数は、通常、暗黙的に継承されるのではなく、派生クラスで明示的に定義されます。C ++仮想継承は、ドミナンスと呼ばれるあいまいさの解決機能を示します。

演算子と演算子のオーバーロード
オーバーロードできない演算子
オペレーター シンボル
スコープ解決演算子 ::
条件演算子 ?:
ドット演算子 .
メンバー選択演算子 .*
「sizeof」演算子 sizeof 「typeid」演算子 typeid CおよびC ++の演算子
C ++は、基本的な算術、ビット操作、間接参照、比較、論理演算などをカバーする35を超える演算子を提供します。条件演算子だけでなく、メンバーアクセス(および)などのいくつかの注目すべき例外を除いて、ほとんどすべての演算子はユーザー定義型に対してオーバーロードできます。オーバーロード可能な演算子の豊富なセットは、C ++のユーザー定義型を組み込み型のように見せるための中心です。..*
オーバーロード可能な演算子は、スマートポインターなど、多くの高度なC ++プログラミング手法の重要な部分でも演算子をオーバーロードしても、演算子を含む計算の優先順位は変更されません。また、演算子が使用するオペランドの数も変更されません(ただし、実行前に評価されますが、演算子は任意のオペランドを無視できます)。オーバーロードされた “” &&””および “” ||””演算子は、短絡評価プロパティを失います。

ポリモーフィズム
参照:
ポリモーフィズム(コンピューターサイエンス)
ポリモーフィズムにより、多くの実装で1つの共通のインターフェースが可能になり、オブジェクトはさまざまな状況下で異なる動作をすることができます。
C ++は、上記の言語機能でサポートされている、いくつかの種類の静的(コンパイル時に解決)および動的(実行時に解決)のポリモーフィズムをサポートします。コンパイル時のポリモーフィズムでは特定の実行時の決定はできませんが、実行時のポリモーフィズムでは通常、パフォーマンスが低下します。

静的ポリモーフィズム
参照:
パラメトリック多相および
アドホック多相
関数のオーバーロードにより、プログラムは同じ名前で引数が異なる複数の関数を宣言できます(つまり、アドホック多相性)。関数は、正式なパラメーターの数またはタイプによって区別されます。したがって、同じ関数名は、それが使用されるコンテキストに応じて異なる関数を参照できます。関数によって返される型は、オーバーロードされた関数を区別するために使用されず、返される型が異なると、コンパイル時のエラーメッセージが表示されます。
関数を宣言するとき、プログラマーは1つ以上のパラメーターにデフォルト値を指定できます。そうすることで、関数が呼び出されたときにデフォルトのパラメーターをオプションで省略できます。この場合、デフォルトの引数が使用されます。宣言されたパラメーターよりも少ない引数で関数が呼び出されると、明示的な引数は左から右の順序でパラメーターと照合され、パラメーターリストの最後にある一致しないパラメーターにはデフォルトの引数が割り当てられます。多くの場合、パラメーターの数が異なるオーバーロードされた関数定義を提供するよりも、単一の関数宣言でデフォルトの引数を指定する方が望ましいです。
C ++のテンプレートは、ジェネリックなポリモーフィックコード(つまり、パラメトリックポリモーフィズム)を記述するための高度なメカニズムを提供します。特に、不思議なことに繰り返されるテンプレートパターンを使用して、仮想関数をオーバーライドするための構文を厳密に模倣する静的ポリモーフィズムの形式を実装することができます。C ++テンプレートはタイプを認識し、チューリング完全であるため、コンパイラーに再帰的な条件を解決させ、テンプレートメタプログラミングを通じて実質的なプログラムを生成させるためにも使用できます。一部の意見に反して、テンプレートコードは、適切なコンパイラ設定でコンパイルした後、バルクコードを生成しません。
動的ポリモーフィズム編集

継承
参照:
サブタイピング
変数ポインターおよびC ++の基本クラス型への参照は、その型の任意の派生クラスのオブジェクトを参照することもできます。これにより、配列やその他の種類のコンテナーが、異なるタイプのオブジェクトへのポインターを保持できるようになります(参照をコンテナーに直接保持することはできません)。これにより、動的(実行時)ポリモーフィズムが可能になり、参照されるオブジェクトは、(実際の、派生した)タイプに応じて異なる動作をする可能性が
C ++は演算子も提供します。これにより、コードは、ベース参照/ポインターを介して、より派生した型であるダウンキャストへのオブジェクトの変換を安全に試行できます。どの派生型が参照されているかわからないことが多いため、この試みが必要です。(アップキャスト、より一般的な型への変換は、コンパイル時に常にチェック/実行できます。祖先クラスは派生クラスのインターフェイスで指定され、すべての呼び出し元に表示されます。)実行時型情報(RTTI)に依存します。タイプとそれらの関係を区別できるようにするプログラムのメタデータ。場合ポインタのに失敗した、結果はデスティネーションは、(nullにすることはできません)参照である場合、キャストが例外をスローし、一方、定数。特定の派生型であることがわかっているオブジェクトは、RTTIとの安全な実行時型チェックをバイパスしてでオブジェクトにキャストできます。したがって、これは、キャストが有効であり、常に有効であるとプログラマーが確信している場合にのみ使用する必要がdynamic_caststatic_castdynamic_castdynamic_castnullptrstatic_castdynamic_cast

仮想メンバー関数
通常、派生クラスの関数が基本クラスの関数をオーバーライドする場合、呼び出す関数はオブジェクトのタイプによって決定されます。特定の関数は、その関数の2つ以上の定義間でパラメーターの数またはタイプに違いがない場合にオーバーライドされます。したがって、コンパイル時に、オブジェクトのタイプを判別できない場合がしたがって、基本クラスポインターのみが指定されている場合、呼び出す正しい関数を判別できません。したがって、決定は実行時まで延期されます。これは動的ディスパッチと呼ばれます。仮想メンバー関数またはメソッドを使用すると、オブジェクトの実際の実行時タイプに応じて、関数の最も具体的な実装を呼び出すことができます。C ++実装では、これは通常、仮想関数テーブルを使用して行われます。オブジェクトタイプがわかっている場合は、関数呼び出しの前に完全修飾クラス名を付加することでこれを回避できますが、通常、仮想関数の呼び出しは実行時に解決されます。
標準のメンバー関数に加えて、演算子のオーバーロードとデストラクタを仮想にすることができます。実際の経験に基づく不正確なルールは、クラス内の関数が仮想である場合、デストラクタも仮想である必要があると述べています。作成時のオブジェクトの型はコンパイル時にわかっているため、コンストラクター、ひいてはコピーコンストラクターを仮想化することはできません。それでも、派生オブジェクトへのポインタがベースオブジェクトへのポインタとして渡されるときに、オブジェクトのコピーを作成する必要がある状況が発生する可能性がこのような場合、一般的な解決策は、呼び出されたときに派生クラスのコピーを作成して返す(または同様の)仮想関数を作成することです。clone メンバー関数は、閉じ括弧の後、セミコロンの前に追加することで「純粋な仮想」にすることもできます。純粋仮想関数を含むクラスは、抽象クラスと呼ばれます。抽象クラスからオブジェクトを作成することはできません。それらはからのみ派生できます。派生クラスは仮想関数を純粋として継承し、派生クラスのオブジェクトを作成する前に、その仮想関数(および他のすべての純粋仮想関数)の非純粋定義を提供する必要が純粋仮想メンバー関数または継承された純粋仮想メンバー関数を使用してクラスのオブジェクトを作成しようとするプログラムは、形式が正しくありません。= 0

ラムダ式
C ++は、ラムダ式とも呼ばれる無名関数を次の形式でサポートします。(パラメータ)-> return_type { function_body }
C ++ 20以降、キーワードなしでラムダにテンプレートパラメーターを記述できます:template
< template_parameters > (パラメータ)-> return_type { function_body }
ラムダがパラメーターを受け取らず、リターンタイプやその他の指定子が使用されていない場合は、()を省略できます。
{ function_body }
ラムダ式のリターンタイプは、可能であれば自動的に推測できます。例:
[](int x 、int y ){ return x + y ; } //推測[](int x 、int y )-> int { return x + y ; } //明示的
このリストは、クロージャの定義をサポートしています。このようなラムダ式は、無名関数オブジェクトのシンタックスシュガーとして標準で定義されています。

例外処理
例外処理は、実行時の問題またはエラーの存在を、それが検出された場所から問題を処理できる場所に伝えるために使用されます。これにより、すべてのエラーを検出しながら、これをメインコードとは別に均一な方法で実行できます。エラーが発生した場合、例外がスロー(発生)され、最も近い適切な例外ハンドラーによってキャッチされます。例外により、現在のスコープが終了し、適切なハンドラーが見つかるまで各外部スコープ(伝播)も終了し、これらの終了したスコープ内のオブジェクトのデストラクタが呼び出されます。同時に、検出された問題に関するデータを保持するオブジェクトとして例外が提示されます。
Google、 LLVM、、Qt などの一部のC ++スタイルガイドでは、例外の使用が禁止されています。
例外を引き起こすコードはブロック内に配置されます。例外は個別のブロック(ハンドラー)で処理されます。次の例に示すように、各ブロックには複数の例外ハンドラーを含めることができます。trycatchtry
#include #include #include int main (){
{を試してください
std ::ベクトル<整数> VEC { 3 、4 、3 、1 }。
int i { vec 。at (4 )}; //例外std :: out_of_rangeをスローします(vecのインデックスは1〜4ではなく0〜3です)
} //例外ハンドラーは、vec.at(4)によってスローされるstd :: out_of_rangeをキャッチします catch (std :: out_of_range &e ){
std :: cerr << ""存在しない要素へのアクセス:"" << e 。what ()<< ' n' ;
} //他の標準ライブラリの例外をキャッチする(それらはstd :: exceptionから派生します) catch (std ::例外&e ){
std :: cerr << ""例外がスローされました:"" << e 。what ()<< ' n' ;
} //認識されない例外(つまり、std :: exceptionから派生しない例外)をキャッチします キャッチ(…){
std :: cerr << ""いくつかの致命的なエラー n "" ; }} キーワードを使用して、意図的に例外を発生させることもできます。これらの例外は通常の方法で処理されます。技術的な理由により、例外を使用できない場合がそのような例の1つは、組み込みシステムの重要なコンポーネントであり、すべての操作が指定された時間内に完了することが保証されている必要が例外を処理するために必要な最大時間を決定するツールが存在しないため、これを例外で決定することはできません。throw
処理関数が障害点から呼び出されるシグナル処理とは異なり、例外処理は、catchブロックに入る前に現在のスコープを終了します。これは、現在の関数または現在スタック上にある以前の関数呼び出しのいずれかに

標準ライブラリ
image
  C ++ 98として承認された「ワーキングペーパー」規格のドラフト。そのサイズの半分はC ++標準ライブラリに割り当てられていました。
C ++標準ライブラリ
C ++標準は、コア言語と標準ライブラリの2つの部分で構成されています。C ++プログラマーは、C ++のすべての主要な実装で後者を期待しています。これには、集約タイプ(ベクトル、リスト、マップ、セット、キュー、スタック、配列、タプル)、アルゴリズム(find、for_each、binary_search、random_shuffleなど)、入出力機能(iostream、読み取りおよび書き込み用)が含まれます。コンソールとファイル)、ファイルシステムライブラリ、ローカリゼーションサポート、自動メモリ管理用のスマートポインター、通常の式のサポート、マルチスレッドライブラリ、アトミックサポート(外部なしで一度に最大1つのスレッドで変数の読み取りまたは書き込みを可能にする)同期)、時間ユーティリティ(測定、現在の時刻の取得など)、C ++例外を使用しないエラーレポートをC ++例外に変換するシステム、乱数ジェネレーター、およびC標準ライブラリのわずかに変更されたバージョン( C ++タイプのシステムに準拠しています)。
C ++ライブラリの大部分は、標準テンプレートライブラリ(STL)に基づいています。STLが提供する有用なツールとしては、容器(例えば、オブジェクトのコレクションとしてベクトルとリスト)、イテレータアレイ状容器へのアクセスを提供し、アルゴリズムそのような検索およびソートなどの操作を行います。
さらに、(マルチ)マップ(連想配列)と(マルチ)セットが提供され、これらはすべて互換性のあるインターフェイスをエクスポートします。したがって、テンプレートを使用すると、任意のコンテナーまたはイテレーターによって定義された任意のシーケンスで機能する汎用アルゴリズムを作成できます。Cと同様に、ライブラリの機能には、ディレクティブを使用して標準ヘッダーを含めることでアクセスします。C ++標準ライブラリ27は廃止された105の標準ヘッダを提供します。#include
この標準には、元々は一般的なアルゴリズムとコンテナーを長年実験してきたアレクサンダーステパノフによって設計されたSTLが組み込まれています。彼がC ++を使い始めたとき、彼はついに、インライン化やコンパイルの使用などのC ++機能のおかげで、たとえばC標準ライブラリqsortよりも優れたパフォーマンスを発揮する汎用アルゴリズム(STLソートなど)を作成できる言語を見つけました。関数ポインタの代わりにタイムバインディング。標準ライブラリの一部にすぎないため、標準では「STL」とは呼ばれていませんが、この用語は、標準ライブラリの他の部分(入力/出力ストリーム、国際化、診断、 Cライブラリサブセットなど)。
ほとんどのC ++コンパイラ、およびすべての主要なコンパイラは、C ++標準ライブラリの標準準拠の実装を提供します。

C ++コアガイドライン
C ++コアガイドラインは、C ++の発明者であるBjarneStroustrupと、C ++ ISOワーキンググループの招集者兼議長であるHerbSutterが主導するイニシアチブであり、プログラマーが言語のベストプラクティスを使用して「ModernC ++」を作成できるようにします。標準C ++ 14以降、およびコンパイラと静的チェックツールの開発者が不正なプログラミング手法をキャッチするためのルールを作成するのに役立ちます。
主な目的は、タイプとリソースに安全なC ++を効率的かつ一貫して作成することです。
コアガイドラインは、CPPCon2015のオープニング基調講演で発表されました。
ガイドラインには、ガイドラインサポートライブラリ(GSL)が付属しており、コアガイドラインとガイドラインルールを適用するための静的チェッカーツールを実装するためのタイプと関数のヘッダーのみのライブラリです。

互換性
コンパイラベンダーにより大きな自由を与えるために、C ++標準委員会は、名前マングリング、例外処理、およびその他の実装固有の機能の実装を指示しないことを決定しました。この決定の欠点は、異なるコンパイラによって生成されたオブジェクトコードには互換性がないと予想されることです。ただし、特定のマシンまたはオペレーティングシステム(C ++ ABIなど)用にコンパイラを標準化する試みがありましたが、現在はほとんど使用されていないようです。

C付き
CとC ++の互換性
C ++は、多くの場合のスーパーセットであると考えられているCが、これは厳密には正しくありません。ほとんどのCコードは、C ++で正しくコンパイルするように簡単に作成できますが、いくつかの違いにより、有効なCコードが無効になったり、C ++での動作が異なったりします。たとえば、Cは他のポインタ型への暗黙的な変換を許可しますが、C ++は(型の安全上の理由から)許可しません。また、C ++のような多くの新しいキーワードを定義し、Cプログラムで(例えば、変数名)識別子として使用することができます。void*newclass
一部の非互換性は、1999年のC標準のリビジョン(C99)によって削除されました。これにより、行コメント(//)やコードと混合された宣言などのC ++機能がサポートされるようになりました。一方、C99は、可変長配列、ネイティブの複素数型など、C ++で互換性がない、または冗長である、C ++でサポートされていない多くの新機能を導入しました(ただし、C ++標準ライブラリのクラスは同様の機能を提供します) 、コード互換ではありませんが)、指定された初期化子、複合リテラル、およびキーワード。 C99で導入された機能の一部は、C ++標準の後続バージョンであるC ++ 11に含まれていました(冗長ではない機能のうち)。 ただし、C ++ 11標準では、有効なCのままである文字ポインタへの文字列リテラルの割り当てを禁止するなど、新しい非互換性が導入されています。std::complexrestrict
CコードとC ++コードを混在させるには、CとC ++の両方で呼び出される/使用される関数宣言または定義を、ブロック内に配置してCリンケージで宣言する必要がこのような関数は、名前マングリング(つまり、関数のオーバーロード)に応じて機能に依存しない場合がextern “”C”” {/*…*/}

批判
C ++への批判
広く採用されているにもかかわらず、Linus Torvalds、 Richard Stallman、 Joshua Bloch、Ken Thompson 、DonaldKnuthなどの著名なプログラマーがC ++言語を批判しています。
C ++で最も頻繁に批判される点の1つは、言語としての複雑さの認識です。実際には、非直交機能の多くはコードをC ++のサブセットに制限する必要があるため、一般的なスタイルやイディオムの読みやすさの利点を回避する必要があるという批判が 。ジョシュア・ブロックが表現したように:
C ++は複雑さのしきい値をはるかに超えてプッシュされたと思いますが、それでも多くの人がC ++をプログラミングしています。しかし、あなたがしていることは、人々にそれをサブセット化するように強制することです。したがって、C ++を使用していることを知っているほとんどすべてのショップは、「はい、C ++を使用していますが、複数実装の継承を行っておらず、演算子のオーバーロードも使用していません」と述べています。結果のコードの複雑さが高すぎるために使用しない機能がたくさんそれを開始する必要がある場合は、良いとは思いません。このプログラマーの移植性は、誰もができるところで失われます。他のみんなのコードを読んでこれはとても良いことだと思います。
ドナルド・クヌース(1993、事前に標準化されたC ++についてコメント)は、エドガー・ダイクストラについて「C ++でのプログラミングを考えると」「彼は身体的に病気になる」と述べた:
私が今日彼らに抱えている問題は… C ++は複雑すぎるということです。現時点では、すべてのエキゾチックな機能を回避しない限り、多くの異なるシステムで機能すると思われるポータブルコードを作成することは不可能です。C ++言語の設計者が、ある問題をどのように解決するかについて2つの競合するアイデアを持っているときはいつでも、「OK、両方を実行します」と言いました。ですから、その言語は私の好みにはバロック的すぎます。
ケン・トンプソンベル研究所のStroustrup氏の同僚だった、彼の評価を与える:
確かに良い点がしかし、概して、それは悪い言語だと思います。それは多くのことを半分うまくやっていて、相互に排他的なアイデアのゴミの山にすぎません。私が知っている人は誰でも、それが個人であろうと企業であろうと、サブセットを選択し、これらのサブセットは異なります。したがって、アルゴリズムを転送するのは適切な言語ではありません。「私はそれを作成しました。ここで、それを取得してください」と言います。大きすぎて複雑すぎます。そしてそれは明らかに委員会によって構築されています。Stroustrupは、彼が言語に対して行ったあらゆる種類の技術的貢献をはるかに超えて、それを採用して使用するために、何年にもわたって何年にもわたってキャンペーンを行いました。そして、彼は鞭と椅子を持ってすべての標準化委員会を運営していました。そして彼は誰にも「ノー」と言った。彼はこれまでに存在したその言語ですべての機能を配置しました。それはきれいに設計されていませんでした—それはやって来たすべてのものの単なる結合でした。そして、それはそれによって劇的に苦しんだと思います。
しかし、ベル研究所の同僚でもあるブライアン・カーニハンは、この評価に異議を唱えています。
C ++は非常に影響力が…多くの人が、C ++は大きすぎて複雑すぎるなどと言いますが、実際には非常に強力な言語であり、そこにあるほとんどすべてのものが本当に正当な理由でそこにランダムな発明をしている人ではありません。 、それは実際に現実世界の問題を解決しようとしている人々です。現在、私たちが今日当たり前と思っている、私たちが使用しているプログラムの多くは、C ++プログラムです。
Stroustrup自身は、C ++のセマンティクスは、その構文よりもはるかにクリーンであるとコメントしています。
その他の苦情が不足挙げられる反射やガベージコレクション、長いコンパイル時間、認知機能のクリープ、 、特にテンプレートメタプログラミングから、エラーメッセージをVERBOSE。

も参照してください
icon
 コンピュータプログラミングポータル
プログラミング言語の比較
C ++コンパイラのリスト
C ++の概要
カテゴリ:C ++ライブラリ

参考文献
^ Stroustrup、Bjarne(1996)。「C ++の歴史:1979-1991」。プログラミング言語の歴史— II。ACM。pp。699–769。土井:10.1145 /234286.1057836。
^ Naugler、David。「C ++およびJavaプログラマー向けのC#2.0:会議ワークショップ」。Journal of Computing Sciences inColleges。22(5)。C#はJavaの影響を強く受けていますが、C ++の影響も強く受けており、C ++とJavaの両方の子孫として最もよく見られます。
^ 「チャペル仕様(謝辞)」(PDF)。Cray Inc. 2015年10月1日。2018年6月24日のオリジナルからアーカイブ(PDF)。
^ 「マイケルフォーガスによるリッチヒッキーQ&A」。
^ ハリー。H. Chaudhary
「Javaプログラミングインタビューのクラッキング:: 2000 + JavaインタビューQue / Ans」。
検索された29 5月2016。
^ ロジャープーン
「JS ++のスケーリング:抽象化、パフォーマンス、および読みやすさ」。
^ 「FAQNimプログラミング言語」。
^ 「9。クラス— Python3.6.4ドキュメント」。docs.python.org。
^ Stroustrup、Bjarne(1997)。「1」。C ++プログラミング言語(第3版)。ISBN  0-201-88954-4。OCLC  59193992。
^ Stroustrup、B。
「講義:C ++の本質。エディンバラ大学」。YouTube。
^ Stroustrup、Bjarne
「C ++アプリケーション」。stroustrup.com。
^ “”ISO / IEC 14882:2020″”。国際標準化機構。
^ 「BjarneStroustrupのホームページ」。www.stroustrup.com。
検索された15 5月2013。
^ 「C ++ ISスケジュール」(PDF)。2020年8月10日のオリジナルからアーカイブ(PDF)。
^ 「C ++;それが向かっているところ」。
^ Stroustrup、Bjarne
「BjarneStroustrupのFAQ:C ++はいつ発明されましたか?」。stroustrup.com。
^ Stroustrup、Bjarne。「現実の世界で、そして現実の世界のために言語を進化させる:C ++ 1991-2006」(PDF)。2007年11月20日のオリジナルからアーカイブ(PDF)。
^ Stroustrup、Bjarne。「C ++の歴史:1979-1991」(PDF)。2019年2月2日のオリジナルからアーカイブ(PDF)。
^ Stroustrup、Bjarne。「C ++プログラミング言語」(初版)。
^ Stroustrup、Bjarne。「C ++プログラミング言語」(第2版)。
^ サッター、ハーブ。「トリップレポート:夏のISO C ++標準会議(オウル)」。herbsutter.com。
C++ 17の次の標準はC ++ 20になります
^ Dusíková、ハナ
「N4817:2020プラハ会議の招待と情報」(PDF)。2019年12月29日のオリジナルからアーカイブ(PDF)。
^ 「現在のステータス」。isocpp.org。
^ 「C ++ 20承認済み-ハーブサッター」。isocpp.org。
^ 「コンピューターサイエンスのパイオニアであるBjarneStroustrupが、2018年のチャールズスタークドレーパーエンジニアリング賞を受賞」(プレスリリース)。全米技術アカデミー。1月3日2018年アーカイブオリジナルの2018年1月3日に。
^ TIOBE。「2021年1月のTIOBEインデックス」。TIOBE.com。TIOBEカンパニー。
^ 「BjarneStroustrupのFAQ–「C ++」という名前はどこから来たのですか?」。
^ 「C ++プログラマー向け」。ノースイースタン大学。
^ 「ISO / IEC14882:1998」。国際標準化機構。
^ 「ISO / IEC14882:2003」。国際標準化機構。
^ “”ISO / IEC 14882:2011″”。国際標準化機構。
^ 「ISO / IEC14882:2014」。国際標準化機構。
^ 「ISO / IEC14882:2017」。国際標準化機構。
^ 「私達は国際標準を持っています:C ++ 0xは満場一致で承認されます」。サッターズミル。
^ 「C ++の未来」。
–channel9.msdn.com経由。
^ 「C ++ 14があります!:標準C ++」。isocpp.org。
^ サッター、ハーブ
「トリップレポート:夏のISO C ++標準会議(トロント)」。
^ 「ISO / IECTR 18015:2006」。国際標準化機構。
^ 「ISO / IECTR 19768:2007」。国際標準化機構。
^ 「ISO / IECTR 29124:2010」。国際標準化機構。
^ 「ISO / IECTR 24733:2011」。国際標準化機構。
^ 「ISO / IECTS 18822:2015」。国際標準化機構。
^ 「ISO / IECTS 19570:2015」。国際標準化機構。
^ 「ISO / IECTS19841:2015」。国際標準化機構。
^ 「ISO / IECTS 19568:2015」。国際標準化機構。
^ 「ISO / IECTS 19217:2015」。国際標準化機構。
^ 「ISO / IECTS 19571:2016」。国際標準化機構。
^ 「ISO / IECTS 19568:2017」。国際標準化機構。
^ 「ISO / IECTS 21425:2017」。国際標準化機構。
^ 「ISO / IECTS 22277:2017」。国際標準化機構。
^ 「ISO / IECTS 19216:2018」。国際標準化機構。
^ 「ISO / IECTS 21544:2018」。国際標準化機構。
^ 「ISO / IECTS 19570:2018」。国際標準化機構。
^ 「ISO / IECTS 23619:2021」。国際標準化機構。
^ 「実験的なC ++機能」のリストを参照してください
。cppreference.com。
^ B. Stroustrup(Sergio De Simoneによるインタビュー)
「Stroustrup:C ++ 17についての考え-インタビュー」。
^ Stroustrup、Bjarne(2000)。C ++プログラミング言語(特殊教育)。アディソン-ウェスリー。p。46. ISBN  0-201-70073-5。
^ Stroustrup、Bjarne。「C ++プログラミング言語(第3版)の未解決の問題」。
このコードは、Bjarne Stroustrupの正誤表ページ(p。633)から直接コピーされています。彼はではなくの使用に取り組んでいます。「voidmain()」と書くことはできますか?も参照して暗黙の説明のためで機能。この暗黙の戻りは、他の関数では使用できません。 ‘n’std::endlreturn 0;main ^ ISO / IEC。プログラミング言語- C ++ 11ドラフト(n3797) アーカイブ2で2018年10月ウェイバックマシン§3.7保管期間 ^ ISO / IEC。プログラミング言語- C ++ 11ドラフト(n3797) アーカイブ2で2018年10月ウェイバックマシン§3.7.1静的記憶域期間[basic.stc.static] ^ ISO / IEC。プログラミング言語- C ++ 11ドラフト(n3797) アーカイブ2で2018年10月ウェイバックマシンがスレッド§3.7.2保存期間[basic.stc.thread] ^ ISO / IEC。プログラミング言語- C ++ 11ドラフト(n3797) アーカイブ2で2018年10月ウェイバックマシン§3.7.3自動記憶域期間[basic.stc.auto] ^ ISO / IEC。言語プログラミング- C ++ 11ドラフト(n3797) アーカイブで2018年10月2日にウェイバックマシン§3.7.4ダイナミック記憶域期間[basic.stc.dynamic] ^ 「C ++コアガイドライン」。isocpp.github.io。
^ “”誰もC ++を理解していません:パート5:テンプレートコードの膨張””。articles.emptycrate.com/:EmptyCrateソフトウェア。トラベル。もの。
時々、誰かがコードの膨張を引き起こすC ++テンプレートについて話しているのを読んだり聞いたりするでしょう。先日考えていたのですが、「自分で、コードがまったく同じことをしているとしたら、コンパイルされたコードをこれ以上大きくすることはできないのではないでしょうか」と思いました。そしてコンパイルされたコードサイズはどうですか?それぞれがコマンドg ++ .cpp-O3でコンパイルされました。非テンプレートバージョン:8140バイト、テンプレートバージョン:8028バイト!
^ サッター、ハーブ; アレキサンドレス、アンドレイ(2004)。C ++コーディング標準:101のルール、ガイドライン、およびベストプラクティス。アディソン-ウェスリー。
^ ヘンリクソン、マット; ナイキスト、エリック(1997)。産業用強度C ++。プレンティスホール。ISBN  0-13-120965-5。
^ Stroustrup、Bjarne(2000)。C ++プログラミング言語(特殊教育)。アディソン-ウェスリー。p。310. ISBN  0-201-70073-5。仮想メンバー関数は、メソッドと呼ばれることも ^ マイクロフト、アラン(2013)。「CおよびC ++の例外|テンプレート」(PDF)。ケンブリッジコンピュータラボラトリー-コース資料2013-14。2016年5月13日のオリジナルからアーカイブ(PDF)。
^ Stroustrup、Bjarne(2013)。C ++プログラミング言語。アディソンウェスリー。p。345. ISBN  9780321563842。
^ Stroustrup、Bjarne(2013)。C ++プログラミング言語。アディソンウェスリー。pp。363–365。ISBN  9780321563842。
^ Stroustrup、Bjarne(2013)。C ++プログラミング言語。アディソンウェスリー。頁345、363 ISBN  9780321563842。
^ 「GoogleC ++スタイルガイド」。
^ 「LLVMコーディング標準」。LLVM9のドキュメント。
^ 「コーディング規約」。QtWiki。
^ Stroustrup、Bjarne(2013)。C ++プログラミング言語。アディソンウェスリー。頁344、370 ISBN  9780321563842。
^ Stroustrup、Bjarne(2013)。C ++プログラミング言語。アディソンウェスリー。p。349. ISBN  9780321563842。
^ Graziano Lo Russo(2008)。「A.ステパノフへのインタビュー」。stlport.org。
^ 「C ++コアガイドライン」。isocpp.github.io。
^ 「BjarneStroustrupがC ++コアガイドラインを発表:標準C ++」。isocpp.org。
^ “”microsoft / GSL””。
–GitHub経由。
^ 「C ++コアガイドラインチェッカーの使用」。docs.microsoft.com。
^ 「C ++ ABIサマリー」。
^ 「BjarneStroustrupのFAQ–CはC ++のサブセットですか?」。
^ 「C9X–新しいC標準」。
^ 「GCCでのC ++ 0xサポート」。
^ 「VC10のC ++ 0xコア言語機能:表」。
^ 「Clang-C ++ 98、C ++ 11、およびC ++ 14ステータス」。Clang.llvm.org。
^ 「Re:より良い文字列ライブラリを使用するようにbuilin-mailinfo.cを変換する」(メーリングリスト)。
^ 「Re:より多くのユーザーを引き付けるための努力?」(メーリングリスト)。
^ Andrew Binstock
「ドブ博士:ケン・トンプソンへのインタビュー」。
取り出される7年2月2014。
^ Peter Seibel
仕事中のコーダー:プログラミングの技術についての考察。押してpp。475–476。ISBN  978-1-4302-1948-4。
^ “”Coders atWorkのC ++””。
^ 「ドナルド・クヌースへのインタビュー」。ドブ博士の。
^ “”アーカイブされたコピー””。2017年11月20日にオリジナルからアーカイブされました 。
^ ブライアンカーニハン
ブライアンカーニハンQ&A-Computerphile。
^ 「Stroustrup:FAQ」。www.stroustrup.com。
^ パイク、ロブ(2012)。「少ないほど指数関数的に多い」。
^ Kreinin、Yossi
「欠陥のあるC ++」。

参考文献
アブラハム、デビッド; Gurtovoy、Aleksey(2005)。C ++テンプレートメタプログラミング:Boost and Beyondの概念、ツール、およびテクニック。アディソン-ウェスリー。ISBN 0-321-22725-5。
アレキサンドレス、アンドレイ(2001)。最新のC ++デザイン:ジェネリックプログラミングとデザインパターンの適用。アディソン-ウェスリー。ISBN 0-201-70431-5。
アレキサンドレス、アンドレイ; サッター、ハーブ(2004)。C ++の設計とコーディングの標準:プログラムを作成するためのルールとガイドライン。アディソン-ウェスリー。ISBN 0-321-11358-6。
ベッカー、ピート(2006)。C ++標準ライブラリ拡張機能:チュートリアルとリファレンス。アディソン-ウェスリー。ISBN 0-321-41299-0。
ブローケン、フランク(2010)。C ++アノテーション。フローニンゲン大学。ISBN 978-90-367-0470-0。
Coplien、James O.(1994)[修正を加えて転載、1992年の発行年]。高度なC ++:プログラミングスタイルとイディオム。ISBN 0-201-54855-0。
デューハースト、スティーブンC.(2005)。C ++の一般的な知識:基本的な中級プログラミング。アディソン-ウェスリー。ISBN 0-321-32192-8。
情報技術工業協議会
プログラミング言語– C ++(第2版)。ジュネーブ:ISO / IEC。14882:2003(E)。
Josuttis、Nicolai M.(2012)。C ++標準ライブラリ、チュートリアルとリファレンス(第2版)。アディソン-ウェスリー。ISBN 978-0-321-62321-8。
ケーニッヒ、アンドリュー; モー、バーバラE.(2000)。Accelerated C ++ –例による実用的なプログラミング。アディソン-ウェスリー。ISBN 0-201-70353-X。
リップマン、スタンレーB。; Lajoie、Josée; モー、バーバラE.(2011)。C ++入門書(第5版)。アディソン-ウェスリー。ISBN 978-0-321-71411-4。
リップマン、スタンレーB.(1996)。C ++オブジェクトモデルの内部。アディソン-ウェスリー。ISBN 0-201-83454-5。
マイヤーズ、スコット(2005)。効果的なC ++(第3版)。アディソン-ウェスリー。ISBN 0-321-33487-6。
Stroustrup、Bjarne(2013)。C ++プログラミング言語(第4版)。アディソン-ウェスリー。ISBN 978-0-321-56384-2。
Stroustrup、Bjarne(1994)。C ++の設計と進化。アディソン-ウェスリー。ISBN 0-201-54330-3。
Stroustrup、Bjarne(2014)。プログラミング:C ++を使用した原則と実践(第2版)。アディソン-ウェスリー。ISBN 978-0-321-99278-9。
サッター、ハーブ(2001)。より優れたC ++:40の新しいエンジニアリングパズル、プログラミングの問題、およびソリューション。アディソン-ウェスリー。ISBN 0-201-70434-X。
サッター、ハーブ(2004)。例外的なC ++スタイル。アディソン-ウェスリー。ISBN 0-201-76042-8。
Vandevoorde、David; Josuttis、Nicolai M.(2003)。C ++テンプレート:完全なガイド。アディソン-ウェスリー。ISBN 0-201-73484-2。

外部リンク
C ++の
姉妹プロジェクトで
image
 ウィクショナリーからの定義
image
 コモンズのメディア
image
 ウィキクォートからの引用
image
 ウィキブックスの教科書
image
 ウィキバーシティからのリソース
JTC1 / SC22 / WG21 – ISO / IEC C ++標準ワーキンググループ
Standard C ++ Foundation –標準C ++の使用と理解を促進する非営利団体。BjarneStroustrupは組織のディレクターです。”