| C++ | |
|---|---|
C++標準化委員会が承認したロゴ | |
| パラダイム | マルチパラダイム:手続き型、命令型、関数型、オブジェクト指向型、汎用型、モジュール型、リフレクティブ型[ 1 ]、契約による設計 |
| 家族 | C |
| デザイン : | ビャルネ・ストロヴストルップ |
| 開発者 | ISO/IEC JTC 1(合同技術委員会1)/SC 22(小委員会22) /WG 21(作業部会21) |
| 初 登場 | 1985年 (1985年) |
| 安定放出 | |
| プレビュー版 | |
| タイピングの規律 | 静的、強い、主格、部分的に推論 |
| OS | クロスプラットフォーム |
| ファイル名拡張子 | .C、.cc、.cpp、.cxx、.c++、.h、.H、.hh、.hpp、.hxx、.h++、. cppm、.ixx [ 3 ] |
| Webサイト | isocpp.org |
| 主な実装例 | |
| GCC、LLVM Clang、Microsoft Visual C++、Embarcadero C++Builder、Intel C++ Compiler、IBM XL C++、EDG | |
| 影響を受けた | |
| Ada、ALGOL 68、[ 4 ] BCPL、[ 5 ] C、CLU、[ 4 ] F#、[ 6 ] [ a ] ML、Mesa、[ 4 ] Modula-2、[ 4 ] Simula、Smalltalk [ 4 ] | |
| 影響を受けた | |
| Ada 95、C#、[ 7 ] C99、Carbon、Chapel、[ 8 ] Clojure、[ 9 ] D、Java、[ 10 ] JS++、[ 11 ] Lua、[ 12 ] Nim、[ 13 ] Objective-C++、Perl、PHP、Python、[ 14 ] Rust [ 15 ] | |
| |
C++ [ b ]は、デンマークのコンピュータ科学者ビャルネ・ストロヴストルップによって作成された高水準の汎用プログラミング言語です。1985 年にC プログラミング言語の拡張として初めてリリースされ、オブジェクト指向(OOP) 機能が追加されました。その後、OOP やその他の機能が追加され、大幅に拡張されました。1997年現在C++98 標準化以降、C++ はマイクロコンピュータなどのシステムやLinuxやWindowsなどのオペレーティングシステム向けの低レベルメモリ操作機能に加えて、関数型機能を追加し、さらに後には汎用プログラミング(テンプレートの使用による) などの機能も追加されました。C++ は通常コンパイル言語として実装され、フリーソフトウェア財団、LLVM、マイクロソフト、インテル、エンバカデロ、オラクル、IBMなど、多くのベンダーがC++ コンパイラを提供しています。[ 16 ]
C++ は、システム プログラミングや組み込み、リソース制約のあるソフトウェア、大規模システムを念頭に置いて設計されており、パフォーマンス、効率性、使用の柔軟性が設計上の特長となっています。[ 17 ] C++ は、ソフトウェア インフラストラクチャやリソース制約のあるアプリケーションなど、他の多くのコンテキストでも有用であることがわかっています。[ 17 ]デスクトップ アプリケーション、ビデオゲーム、サーバー( e コマース、ウェブ検索、データベースなど)、パフォーマンスが重要なアプリケーション (電話交換機や宇宙探査機など)が含まれます。[ 18 ]
C++ は国際標準化機構(ISO)によって標準化されており、最新の標準バージョンは 2024 年 10 月にISO/IEC 14882:2024 (非公式にはC++23として知られています) として ISO によって承認および発行されています。[ 19 ] C++ プログラミング言語は、最初に 1998 年にISO/IEC 14882:1998として標準化され、その後、C++03、C++11、C++14、C++17、およびC++20標準によって修正されました。次のC++23標準は、新機能と拡張された標準ライブラリでこれらに取って代わりました。1998 年の最初の標準化の前に、C++ は 1979 年以来ベル研究所のストロストルップによって C 言語の拡張として開発されました。彼は、プログラム編成のための高レベル機能も提供する、C に似た効率的で柔軟な言語を求めていました。[ 20 ] 2012年以降、C++は3年ごとのリリーススケジュールで運用されており[ 21 ]、次の標準はC++29となる予定です。 [ 22 ]

1979年、デンマークのコンピュータ科学者であるビャルネ・ストロヴストルップは、「C++ の前身であるC with Classes 。 [ 23 ]新しい言語を作成する動機は、Stroustrup が博士論文のためにプログラミングを行った経験から生まれた。Stroustrup は、 Simula には大規模ソフトウェア開発に非常に役立つ機能があるが、実用には遅すぎる言語であることを発見した。一方、 BCPL は高速だが、大規模ソフトウェア開発には低レベルすぎる。Stroustrup がAT&T Bell Labsで働き始めたとき、分散コンピューティングに関してUNIXカーネルを分析するという問題に直面したSimula のような機能でC言語を拡張することに着手した。 [ 24 ] C が選ばれたのは、汎用性、高速性、移植性、そして広く使用されているためである。C と Simula の影響に加えて、 ALGOL 68、 Ada、 CLU、 MLなどの他の言語もこの新しい言語に影響を与えた。 [ 25 ]
当初、ストロストルップの「C with Classes」は、CコンパイラCpreにクラス、派生クラス、厳密な型付け、インライン化、デフォルト引数などの機能を追加しました。[ 26 ]

1982年、ストロストルップは、従来のコンパイラ技術を使用して、クラスを備えたCの後継となる、より洗練された拡張版の設計を開始しました。[ 27 ]この言語は、C++という名前が採用される前に、一時的にC84と呼ばれていました。この名前はリック・マスキッティによって提案され、Cの++インクリメント演算子に由来しています。[ 27 ] [ 28 ]結果として生まれた言語には、仮想関数、関数と演算子のオーバーロード、参照、const改良された型チェック、ユーザー制御のフリーストアメモリ割り当て(new/ delete)、およびBCPLスタイルの単一行//コメントが含まれていました。[ 27 ]ストロストルップはまた、 1982年の春から1983年の夏にかけて、C++コンパイラのフロントエンドであるCfrontを設計および実装しました。[ 27 ]
1984年、ストロストルップは最初のストリーム入出力ライブラリを実装した。名前付き出力関数ではなく出力演算子を提供するというアイデアは、ダグ・マキロイ[ 4 ](以前にUnixパイプを提案した人物)によって提案された。
1985年に『The C++ Programming Language』の初版がリリースされ、公式の標準がまだ存在しなかったため、この言語の決定版リファレンスとなった。[ 29 ]同年10月には、C++の最初の商用実装がリリースされた。[ 23 ]
1989年にC++ 2.0がリリースされ、 1991年にはC++プログラミング言語の改訂第2版が出版されました。[ 30 ] 2.0の新機能には、多重継承、抽象クラス、静的メンバ関数、constメンバ関数、保護メンバが含まれていました。1990年には、注釈付きC++リファレンスマニュアルが出版されました。このマニュアルは、将来の標準の基礎となりました。その後、テンプレート、例外、名前空間、新しいキャスト、ブール型などの機能が追加されました。
1998年にC++98がリリースされ、言語が標準化され、2003年にはマイナーアップデート(C++03)がリリースされた。
C++98 以降、C++ は比較的ゆっくりと進化し、2011 年にC++11標準がリリースされ、多数の新機能が追加され、標準ライブラリがさらに拡張され、C++ プログラマにより多くの機能が提供されました。2014 年 12 月にマイナーアップデートのC++14がリリースされた後、 C++17でさまざまな新機能が導入されました。[ 31 ] 2020 年 2 月に最終決定された後、[ 32 ] C++20 標準のドラフトが 2020 年 9 月 4 日に承認され、2020 年 12 月 15 日に正式に公開されました。[ 33 ] [ 34 ]
2018年1月3日、ストロストルップは「C++プログラミング言語の構想と開発」により、 2018年のチャールズ・スターク・ドレイパー工学賞の受賞者として発表された。 [ 35 ]
2022年12月、C++はTIOBEインデックスで3位にランクインし、インデックス史上初めてJavaを上回った。 2024年11月現在 この言語はPythonに次いで2位にランクインし、Javaは3位となっている。[ 36 ]
2025年3月、ストロストルップは言語コミュニティに対し、この言語を守るよう呼びかけた。この言語は手動メモリ管理を可能にするため、プログラマーが意図せず誤用すると、バッファオーバーフローなどのセキュリティリスクとなるバグがプログラムに導入される可能性がある。[ 37 ]
ストロストルップによれば、「この名前は、C からの変更の進化的な性質を示している」とのことである。 [ 38 ]この名前は、リック・マシッティ (1983 年中頃) [ 26 ]によるもので、1983 年 12 月に初めて使用された。1992 年にマシッティが非公式に命名について質問された際、彼は冗談のつもりで付けたと述べている。この名前は、C の++演算子(変数の値をインクリメントする) と、拡張されたコンピュータ プログラムを示すために「+」を使用する一般的な命名規則に由来している。
C++の開発期間中、この言語は最終的な名前を得る前に「新しいC」や「クラス付きC」 [ 26 ] [ 39 ]と呼ばれていました。
C++の歴史を通じて、その開発と進化は一連の原則によって導かれてきました。[ 24 ]
C++は、JTC1/SC22/WG21として知られるISOワーキンググループによって標準化されています。ワーキンググループは毎年3週間の会議を開催しています。[ 46 ]これまでにC++標準の7つの改訂版を公開しており、現在は次の改訂版であるC++26に取り組んでいます。

1998年、ISOワーキンググループはC++を初めて標準化し、ISO/IEC 14882:1998(通称C++98)としました。2003年には、C++98で指摘された問題を修正したC++標準の新バージョン、ISO/IEC 14882:2003を発表しました。
次の主要な標準改訂は非公式に「C++0x」と呼ばれていましたが、2011年までリリースされませんでした。 [ 47 ] C++11 (14882:2011) には、コア言語と標準ライブラリの両方への多くの追加が含まれていました。[ 42 ]
2014年に、C++14(C++1yとも呼ばれる)がC++11の小規模な拡張としてリリースされ、主にバグ修正と小規模な改善が行われた。[ 48 ] 国際標準草案の投票手続きは2014年8月中旬に完了した。[ 49 ]
C++14 の後、 C++17というメジャー改訂版(非公式には C++1z として知られる) が、2017 年 7 月中旬に ISO C++ 委員会によって完成し、2017 年 12 月に承認および公開されました。[ 50 ]
ISOは標準化プロセスの一環として、技術報告書や仕様書も発行しています。
より詳細な技術仕様は現在開発中で、承認待ちです。
C++ 言語には主に 2 つの構成要素があります。1 つは主に C サブセットによって提供されるハードウェア機能の直接マッピング、もう 1 つはそれらのマッピングに基づくオーバーヘッドゼロの抽象化です。Stroustrup は C++ を「効率的で洗練された抽象化を構築および使用するために設計された軽量抽象化プログラミング言語」と説明しています[ 17 ] 。また、「ハードウェアへのアクセスと抽象化の両方を提供することが C++ の基本です。それを効率的に行うことが、他の言語と区別される点です」とも述べています[ 70 ] 。
C++ はC の構文のほとんどを継承しています。C標準に準拠したハローワールドプログラムは、有効な C++ ハローワールドプログラムでもあります。以下は、 C++ 標準ライブラリのストリーム機能を使用してメッセージを標準出力に書き込むBjarne Stroustrup のハローワールドプログラムのバージョンを改変したものです。[ 71 ] [ 72 ] [ c ]
#include <iostream>int main () {std :: cout << "Hello, world! \n " ;}C++23以降、 std::print関数とstdモジュールの導入により、これはより簡潔に次のように表現できます。
import std ;int main () {std :: println ( "Hello, world!" );}
C++ 標準は、コア言語と標準ライブラリの両方を規定しています。ライブラリ条項は、ライブラリの内容、整形式の C++ プログラムがライブラリを使用する方法、および準拠する実装に課される要件を記述しています。[ 73 ]
標準ライブラリは、言語サポート、診断、メモリ管理、メタプログラミング、汎用ユーティリティ、コンテナ、イテレータ、範囲、アルゴリズム、文字列、テキスト処理、数値、時間、入出力、並行処理サポートなどの領域に整理されています。[ 73 ]また、C++ヘッダーなどを介してC 標準ライブラリの機能も提供します。C でマクロとして定義されている名前を除き、これらの宣言は名前空間に配置されます。[ 74 ]<cstdio><cstdlib>std
ライブラリ機能は従来、標準ヘッダーを含めることによって利用可能になっていました。たとえば、。 C++20 以降、インポート可能な標準ライブラリヘッダーはヘッダーユニットとしてインポートすることもできます。 C++23 では、名前付き標準ライブラリモジュールとが追加されました。は名前空間 の宣言をエクスポートし、 はC ライブラリ機能に対応するグローバル名前空間の宣言もエクスポートします。[ 75 ]#include<vector>stdstd.compatstdstdstd.compat
標準ライブラリに大きな影響を与えたのは、 1994 年に Alexander Stepanov と Meng Lee によって C++ 標準化委員会に提案された汎用プログラミングライブラリであるStandard Template Library (STL) です。コンテナ、イテレータ、汎用アルゴリズムのモデルは標準 C++ ライブラリの一部となりましたが、標準ライブラリには入出力、ローカリゼーション、診断、C ライブラリのサブセットなど、他にも多くの機能が含まれています。[ 76 ] [ 77 ]
C++ コア ガイドライン[ 78 ]は、C++ ISO ワーキング グループの招集者および議長である Stroustrup と Herb Sutter が主導するイニシアチブであり、プログラマが言語標準 C++11 以降のベスト プラクティスを使用して「モダン C++」を記述できるように支援し、コンパイラおよび静的チェック ツールの開発者が不適切なプログラミング プラクティスを検出するためのルールを作成できるように支援します。主な目的は、型およびリソースが安全な C++ を効率的かつ一貫して記述することです。しかしながら、このガイドラインは ISO C++ 標準委員会によって承認されておらず、委員会の合意を表すものでもありません。[ 79 ]
コアガイドラインは、CPPCon 2015のオープニング基調講演で発表されました[ 80 ] 。
ガイドラインには、コアガイドラインを実装するための型と関数のヘッダーのみのライブラリであるガイドラインサポートライブラリ (GSL) と、ガイドラインのルールを強制するための静的チェッカーツールが付属しています。[ 81 ]この実装の最大のものの 1 つは、Microsoft の実装です。[ 82 ]std::byte GSL の既存の機能の多くは、スマートポインタやなど、後に言語に統合されましたstd::span。[ 82 ]
コンパイラベンダーにより大きな自由を与えるため、C++ 標準化委員会は、名前マングリング、例外処理、その他の実装固有の機能の実装を規定しないことを決定しました。この決定の欠点は、異なるコンパイラによって生成されたオブジェクトコードが互換性がないことが予想されることです。ただし、特定のマシンやオペレーティングシステム向けにコンパイラを標準化しようとする試みもあります。たとえば、Itanium C++ ABI は(その名前にもかかわらず)プロセッサ非依存であり、GCC と Clang によって実装されています。[ 83 ]
C++ はCの上位互換とみなされることが多いが、厳密にはそうではない。[ 84 ]ほとんどの C コードは C++ で正しくコンパイルできるが、いくつかの違いにより、有効な C コードが C++ では無効になったり、動作が異なったりすることがある。たとえば、C では から他のポインタ型への暗黙的な変換が可能であるが、C++ では(型の安全性の理由から)不可能である。また、C++ では、C プログラムで識別子(たとえば変数名)として使用できる、やなどの多くの新しいキーワードが定義されている。void*newclass
1999 年の C 標準の改訂 ( C99 ) により、いくつかの非互換性が解消され、行コメント ( //) や宣言とコードの混在など、C++ の機能をサポートするようになりました。一方、C99 では、可変長配列、ネイティブ複素数型 (ただし、 C++ 標準ライブラリのクラスはコード互換性はないものの同様の機能を提供します)、指定初期化子、複合リテラル、キーワードなど、C++ ではサポートされておらず、 C++ では非互換性または冗長な新機能が多数導入されました。[ 85 ] C99 で導入された機能の一部は、後続の C++ 標準であるC++11に含まれました(冗長でないもの)。[ 86 ] [ 87 ] [ 88 ]しかし、C++11 標準では、文字列リテラルを文字ポインタに代入することを許可しないなど、新しい非互換性が導入されています。これは、C では有効なコードです。std::complexrestrict
C言語とC++言語のコードを混在させるには、C言語とC++言語の両方から呼び出される、または両方で使用される関数宣言または定義は、ブロック内に配置することでCリンケージで宣言する必要があります。このような関数は、名前修飾(つまり、関数オーバーロード)に依存する機能を使用することはできません。extern"C"{/*...*/}
C または C++ で開発されたプログラムは、パフォーマンスの最適化が不可欠な場合、低レベルの機能、高速性、および高レベルプログラミング言語と比較して強化された制御を活用するために、インラインアセンブリをよく利用します[ 89 ] [ 90 ] 。C++ はasm 宣言を使用してアセンブリ言語を埋め込むサポートを提供していますが[ 91 ] 、インラインアセンブリの互換性はコンパイラとアーキテクチャによって大きく異なります。PythonやJavaなどの高レベル言語の機能とは異なり、アセンブリコードは基盤となるプロセッサとコンパイラの実装に大きく依存します。
C++コンパイラによって、インラインアセンブリの実装方法は異なります。
__asm__キーワードの代わりにを使用します。これにより、入力/出力オペランドと上書きレジスタを指定できます。このアプローチは、Intel [ 93 ]や IBM [ 94 ]のコンパイラなど、他の場所でも採用されています。asm-ansi-std__asmキーワードによるインラインアセンブリがサポートされていましたが、64 ビットモードではこのサポートが削除され、代わりに別の .asm モジュールが必要になりました。[ 95 ]C++ は、アセンブリ コードを統合するための 2 つの主要な方法を提供します。1 つはスタンドアロン アセンブリ ファイルで、アセンブリ コードは別々に記述され、C++ コードとリンクされます。[ 97 ] 2 つはインライン アセンブリで、アセンブリ コードはコンパイラ固有の拡張機能を使用して C++ コード内に埋め込まれます。
'\n'std::endlreturn 0;mainC# は Java から強い影響を受けていますが、C++ からも強い影響を受けており、C++ と Java の両方の子孫と見なすのが最適です。
C++17の次の標準はC++20になります
これらのガイドラインは ISO C++ 標準化委員会によって承認されていますか? これらは委員会の合意を表していますか? いいえ。これらのガイドラインは標準の範囲外です。これらは標準に役立ち、現在の Standard C++ を効果的に使用する方法に関する最新のガイドラインとして維持されることを意図しています。私たちは、委員会によって進化する標準と同期するように努めています。