1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

C/C++の入門書を作っています

1
Last updated at Posted at 2026-09-07

●テキスト本体(PDF形式620ページ:3.44MB) 2026/09/23更新
 (→ミラーサイトからDL)(→GitHubからDL)
DOI:https://doi.org/10.5281/zenodo.22654593
---------------------
概ねC17,C++17に準拠しています.C言語,C++言語を一通り学べる内容を目指しています.
各種のコンパイラについても基礎解説を載せましたが,内容はGCCに基づいています.
数値演算結果の可視化も視野に入れています.巻末付録にgnuplot(可視化ツール)の基本的な使い方を収録しています.
高精度演算(多倍長精度演算)の方法も含めました.
通信の機能は解説していません.

本書はフリーソフトウェアの書籍です.無断で改変しなければ自由に使っていただいて結構です.(印刷,再配布も可)
---------------------
テキストに掲載されているサンプルコードは概ねここにあります.
---------------------
C言語で作った動的ライブラリをPythonから利用する方法を「Python3ライブラリブック」のctypesの節で解説しています.Pythonの実行速度の問題を解決するうえで重要です.
ライブラリブックはこちらで配布しています.
---------------------
(2026/09/07)
学校でプログラミング教えています.
教育現場で使うためのC/C++の入門書を作っています.
既に何かの言語を習得している人が,C/C++を学ぶための入門書というスタンスです.
Pythonなどの言語を習得した人が,C/C++を学ぶのに適しているかと思います.

最近は,C/C++を学ぶための障壁が,ものすごく高くなっているように感じます.C/C++を実用的な段階まで学ぶには,言語そのものだけでなく,標準ライブラリ,コンパイラ,リンク,メモリ管理,開発環境など,多くのことを理解しなければなりません.特にC++は高度に仕様が拡張され,言語を一通り学ぶだけでも,かなりの労力を要します.

教材も,そのまま授業で使えるような手頃なものをなかなか見つけられません.高度に専門的な書籍か,軽いチュートリアルのような本に二極化している印象があります.

我々教員が学校でC/C++を教える場合も,限られた授業時間の中で言語の設計思想と要点だけを講述し,少しだけコードを書く実習をして,
「後は全部,自分で調べなさい.書籍もネット情報もたくさんありますから.」
と,学生に投げつけるしかないのが現状です.しかし,これでは現実的に学生が育ちません.

もちろん,
「自力で情報を収集し,得られた知識を自分の中で体系化することも重要な学びです.」
という主張は重要だと思います.現に私も,そのようなことを学生達に言ってきた教員です.

しかし,C/C++について学ぶべき事柄が増え,情報源も膨大になった現在では,最初からその方法だけで学習させることには無理があるのではないかと思うようになりました.何が重要で,どの順序で学び,どこまで理解すれば実用段階へ進めるのかを見通すこと自体が,初心者には困難だからです.

これは,特に理工系の大学生や大学院生にとって大きな問題になっていると思います.
必要なプログラミング能力を身につけられないために,研究活動に十分に取り組めないということも,少なくないように感じます.
本来の目的である研究活動を遂行する以前に,プログラミング言語の習得にあまりにも多くの時間と労力を取られているのではないか,という疑問を払拭できません.

そういうわけで,自分がC/C++を指導するために,学生に渡せる入門書を作っています.
常に未完成で,修正を続けています.
 
---------------------
ご意見いただけましたらありがたいです.
入門書PDFの末尾のページに連絡先があります.
また,私のサイトの末尾にコメント入力欄があります.匿名で,入力内容非公開で受け付けております.

更新履歴

---(2026/09/23)----------------------------------------------
 .DLL や .so などの動的ライブラリを作る方法を追記しました.


索引

■ 第1部 C言語の基礎 --- 1
1 はじめに --- 2
  1.1 C言語の歴史 --- 2
    1.1.1 C++ --- 2
  1.2 プログラミングに関する前提知識 --- 2
    1.2.1 機械語,アセンブリ言語,コンパイラ --- 2
    1.2.2 インタプリタ,仮想機械 --- 3
  1.3 本書で使用するC言語処理系 --- 3
    1.3.1 GNU Projectについて --- 3
    1.3.2 LinuxとGCC --- 4
    1.3.3 本書で使用するツール --- 4
2 C言語プログラムの基本構造 --- 5
  2.1 main関数の型,戻り値 --- 6
  2.2 プリプロセッサ --- 6
  2.3 プログラムのコンパイルと実行 --- 6
  2.4 関数定義の順序とプロトタイプ宣言 --- 7
  2.5 関数への引数の受け渡しについて --- 8
  2.6 リテラル --- 8
    2.6.1 数値リテラルのサフィックス --- 9
    2.6.2 数値リテラルのプレフィックス --- 9
    2.6.3 文字列リテラル --- 11
    2.6.4 定数のマクロ定義 --- 11
  2.7 識別子の命名規則 --- 12
3 変数,型,数値 --- 13
  3.1 変数の宣言 --- 13
  3.2 値の代入 --- 13
    3.2.1 定数としての変数 --- 13
    3.2.2 複合代入 --- 14
  3.3 基本的な型 --- 14
  3.4 変数のスコープと記憶期間 --- 15
    3.4.1 静的変数 --- 16
    3.4.2 グローバル変数 --- 17
  3.5 数値 --- 18
    3.5.1 整数が扱える値の範囲 --- 18
      3.5.1.1 最大幅整数型 --- 20
    3.5.2 浮動小数点数が扱える値の範囲 --- 20
      3.5.2.1 特殊な値 --- 21
    3.5.3 算術演算 --- 23
      3.5.3.1 インクリメント,デクリメント --- 23
    3.5.4 浮動小数点数の誤差 --- 24
    3.5.5 キャストによる型の変換 --- 25
    3.5.6 数学関数 --- 26
      3.5.6.1 丸めモードの設定 --- 26
      3.5.6.2 乱数の生成 --- 27
    3.5.7 複素数型 --- 29
      3.5.7.1 虚数単位 --- 29
      3.5.7.2 実部と虚部の取得 --- 29
      3.5.7.3 複素数用の数学関数 --- 30
      3.5.7.4 複素数の出力 --- 30
  3.6 配列 --- 31
    3.6.1 配列宣言時の初期化 --- 32
    3.6.2 配列全体を複製する方法 --- 33
  3.7 文字と文字列 --- 33
    3.7.1 文字コードのリテラル表現 --- 34
    3.7.2 文字列の長さ --- 34
  3.8 書式文字列と変換指定子 --- 35
    3.8.1 エスケープシーケンス --- 37
  3.9 型の別名の定義 --- 38
4 制御構造 --- 39
  4.1 条件分岐 --- 39
    4.1.1 if文 --- 39
      4.1.1.1 条件判定式 --- 40
      4.1.1.2 _Bool型とbool --- 41
      4.1.1.3 浮動小数点数の判定 --- 42
      4.1.1.4 複素数の等値性の判定 --- 44
    4.1.2 条件演算子による条件式 --- 44
    4.1.3 switch文 --- 45
  4.2 反復 --- 47
    4.2.1 while文 --- 47
      4.2.1.1 do文 --- 48
    4.2.2 for文 --- 48
      4.2.2.1 コンマ演算子 --- 49
  4.3 無条件ジャンプ --- 50
5 構造体 --- 51
  5.1 構造体の様々な定義方法 --- 52
    5.1.1 構造体型の別名の定義 --- 53
    5.1.2 構造体をメンバとして持つ構造体 --- 53
    5.1.3 関数内で定義するローカルな構造体型 --- 54
  5.2 構造体の代入と複製 --- 54
    5.2.1 構造体のメンバとしての配列の扱い --- 55
    5.2.2 関数呼び出しに伴う構造体の複製 --- 55
6 メモリとポインタ --- 57
  6.1 ポインタ --- 58
  6.2 ポインタを介した値の受け渡し --- 59
    6.2.1 関数間での変数の間接的な共有 --- 61
  6.3 配列のポインタとしての扱い --- 62
    6.3.1 配列名とポインタ --- 63
    6.3.2 ポインタの加算 --- 63
    6.3.3 配列とポインタの違い --- 64
      6.3.3.1 関数定義の仮引数の書き方 --- 64
  6.4 ヌルポインタとNULL --- 65
7 入出力 --- 67
  7.1 ストリーム:入出力の対象 --- 67
  7.2 標準出力,標準エラー出力 --- 67
    7.2.1 出力のリダイレクト --- 68
  7.3 標準入力 --- 69
    7.3.1 入力のリダイレクト --- 70
    7.3.2 入力用の様々な関数 --- 70
      7.3.2.1 文字列の読込み --- 70
      7.3.2.2 書式指定の読込み:scanf --- 73
  7.4 ファイル入出力 --- 74
    7.4.1 ファイルのオープンとクローズ --- 74
    7.4.2 テキストファイルとバイナリファイル --- 74
    7.4.3 ファイルへの出力 --- 75
      7.4.3.1 出力バッファの強制書き出し:fflush --- 76
    7.4.4 ファイルからの入力 --- 77
    7.4.5 バイナリデータの扱い --- 79
    7.4.6 既存のファイルの変更 --- 81
    7.4.7 ファイルのアクセス位置の操作 --- 83
      7.4.7.1 ファイルのアクセス位置の移動:fseek --- 83
      7.4.7.2 アクセス位置の取得:ftell --- 84
      7.4.7.3 ファイル先頭への移動:rewind --- 85
    7.4.8 ファイルアクセスの際のエラーの確認:ferror --- 87
  7.5 低水準入出力 --- 88
    7.5.1 低水準入出力の基本概念 --- 88
    7.5.2 ファイルのオープン:open --- 89
      7.5.2.1 フラグとモード --- 89
    7.5.3 書き込み:write --- 90
      7.5.3.1 出力の確定処理 --- 91
    7.5.4 読み込み:read --- 91
    7.5.5 ファイルのクローズ:close --- 92
    7.5.6 入出力の効率化 --- 93
8 分割コンパイルとプリプロセッサ --- 94
  8.1 分割コンパイルのための基礎事項 --- 94
    8.1.1 externによる共有 --- 96
    8.1.2 static宣言による共有範囲の制限 --- 97
  8.2 プリプロセッサ --- 98
    8.2.1 ヘッダファイルの読込み(#include) --- 98
    8.2.2 定数マクロ(#define) --- 98
      8.2.2.1 条件コンパイルへの応用 --- 99
      8.2.2.2 インクルードガード --- 100
      8.2.2.3 処理環境に関する定数 --- 101
9 実用的なプログラミングに必要な事柄 --- 102
  9.1 関数の再帰的定義 --- 102
    9.1.1 関数呼び出しにおけるメモリの管理の仕組み --- 103
    9.1.2 関数の再帰呼び出しに関する問題点 --- 104
      9.1.2.1 スタックのサイズに関すること --- 104
      9.1.2.2 計算規模に関すること --- 105
    9.1.3 複雑な問題を再帰的関数で解決する例 --- 107
  9.2 関数定義の高度な方法 --- 109
    9.2.1 可変長の引数 --- 109
      9.2.1.1 受け取った可変長引数の個数について --- 111
      9.2.1.2 受け取った可変長引数の型について --- 111
    9.2.2 関数のポインタ --- 111
      9.2.2.1 関数ポインタの配列 --- 112
  9.3 ビット演算 --- 114
    9.3.1 ビット演算の実用的な応用 --- 115
    9.3.2 ビットフィールド --- 117
      9.3.2.1 C言語の標準として使用できるビットフィールドの型 --- 118
      9.3.2.2 ビットフィールド使用上の注意 --- 120
  9.4 共用体 --- 121
  9.5 データのバイト順(バイトオーダー)に関すること --- 124
    9.5.1 バイト順の反転 --- 124
    9.5.2 ホスト/ネットワークバイト順変換関数 --- 125
  9.6 文字列操作関数 --- 127
    9.6.1 文字列の長さの取得: strlen --- 127
    9.6.2 文字列の複製: strcpy --- 127
    9.6.3 文字列の比較: strcmp --- 127
    9.6.4 文字列の連結: strcat --- 127
    9.6.5 文字の検索: strchr --- 127
    9.6.6 文字列の検索: strstr --- 128
    9.6.7 書式整形結果の文字列の作成: sprintf/snprintf --- 128
  9.7 文字列解析関数 --- 130
    9.7.1 文字列からの値の読み取り: sscanf --- 130
    9.7.2 文字列を整数値に変換する関数:strtol / strtoll / strtoul / strtoull --- 130
    9.7.3 文字列を浮動小数点数に変換する関数:strtof / strtod / strtold --- 131
  9.8 メモリの柔軟な取扱い --- 134
    9.8.1 メモリの初期化 --- 135
    9.8.2 メモリの複製(コピー) --- 136
    9.8.3 メモリの比較 --- 138
  9.9 プログラム実行のためのメモリモデル --- 140
    9.9.1 ヒープ領域の利用 --- 141
  9.10 列挙型:名前付き整数の扱い --- 144
    9.10.1 列挙子の値の割当てに関する注意点 --- 144
    9.10.2 列挙型を使用する目的に関すること --- 145
  9.11 シグナル処理とジャンプ --- 147
    9.11.1 シグナル処理の仕組みと流れ --- 147
    9.11.2 シグナル処理関数:signal --- 148
    9.11.3 シグナル処理のための変数 --- 148
    9.11.4 ハンドラからの強制的な制御移動 --- 150
    9.11.5 シグナルを他のプログラムに通知する方法 --- 152
    9.11.6 使用頻度の高いシグナル --- 152
  9.12 日付,時刻の扱い --- 154
    9.12.1 UNIX時間 --- 154
    9.12.2 時間を取り扱うための基本的な機能 --- 154
      9.12.2.1 日付,時刻の書式整形 --- 155
      9.12.2.2 日付,時刻の文字列からの読取り --- 156
    9.12.3 高精度の時間計測 --- 158
  9.13 プログラムの一時停止 --- 159
    9.13.1 POSIX環境での方法 --- 159
    9.13.2 Windows環境での方法 --- 160
    9.13.3 待ち時間を実現する際の推奨されない方法 --- 161
  9.14 コマンドライン引数 --- 163
    9.14.1 main関数の引数 --- 163
    9.14.2 コマンドラインの記述に関すること --- 163
  9.15 プログラムの終了処理 --- 166
    9.15.1 exit関数によるプログラムの終了 --- 166
    9.15.2 abort関数によるプログラムの異常終了 --- 168
■ 第2部 C++ --- 170
10 C++とは --- 171
11 C++の基礎 --- 173
  11.1 main関数の記述の形式 --- 173
  11.2 クラスとオブジェクトに関する予備知識 --- 173
  11.3 C++の基本的なデータ型 --- 173
    11.3.1 変数宣言時の初期化 --- 174
    11.3.2 C++での複素数の扱い --- 174
  11.4 入出力 --- 175
    11.4.1 iostream --- 175
    11.4.2 書式制御の方法(C言語の変換指定子との違い) --- 175
      11.4.2.1 桁数,精度の設定 --- 175
      11.4.2.2 左右のアラインメントと埋め文字 --- 176
    11.4.3 ファイルストリーム --- 177
      11.4.3.1 出力ファイルストリーム(ofstream) --- 177
      11.4.3.2 入力ファイルストリーム(ifstream) --- 178
      11.4.3.3 入出力ファイルストリーム(fstream) --- 179
      11.4.3.4 バイナリファイルの扱い --- 179
      11.4.3.5 入出力位置の制御 --- 180
      11.4.3.6 ファイルの一括読み込み --- 183
    11.4.4 ストリームに対する各種の関数 --- 184
      11.4.4.1 ストリーム状態の検査 --- 184
      11.4.4.2 ストリーム状態の操作 --- 185
      11.4.4.3 入力補助関数 --- 186
      11.4.4.4 バイナリ入出力に関わる関数 --- 187
      11.4.4.5 その他の機能 --- 188
    11.4.5 C言語のstdioの利用 --- 189
  11.5 名前空間 --- 190
    11.5.1 名前空間の指定 --- 190
    11.5.2 主な名前空間 --- 190
    11.5.3 独自の名前空間の定義 --- 191
  11.6 C++における型の考え方 --- 192
    11.6.1 論理型(bool型) --- 192
      11.6.1.1 bool値の入出力時の形式 --- 193
    11.6.2 特殊な数値 --- 195
    11.6.3 バイトを表す型(byte型) --- 196
    11.6.4 C++の標準文字列クラス --- 197
      11.6.4.1 stringオブジェクトとして扱えるデータサイズ --- 197
      11.6.4.2 文字列へ出力するストリーム:ostringstream --- 198
      11.6.4.3 文字列から入力するストリーム:istringstream --- 199
    11.6.5 明示的なヌルポインタ:nullptr --- 201
    11.6.6 型名としての構造体名 --- 202
    11.6.7 型変換 --- 202
      11.6.7.1 static_cast --- 202
      11.6.7.2 const_cast --- 203
      11.6.7.3 reinterpret_cast --- 203
      11.6.7.4 型で意味を表す設計 --- 204
  11.7 参照 --- 204
    11.7.1 関数呼び出しにおける参照の応用 --- 204
      11.7.1.1 構造体を参照で渡すケース --- 206
      11.7.1.2 参照を返す関数 --- 207
    11.7.2 一時オブジェクトとconst参照 --- 209
    11.7.3 参照とポインタの違い --- 210
  11.8 関数のオーバーロード --- 211
    11.8.1 オーバーロードの設計上の注意 --- 212
      11.8.1.1 引数が参照である場合 --- 213
    11.8.2 デフォルト引数 --- 213
  11.9 autoによる型推論 --- 215
  11.10 範囲に基づくfor文 --- 217
    11.10.1 要素を参照として受け取る場合 --- 218
  11.11 コンパイル時定数:constexpr --- 219
  11.12 値のカテゴリ --- 220
  11.13 例外処理 --- 221
    11.13.1 例外として扱われる事象 --- 221
    11.13.2 例外のハンドリング --- 222
    11.13.3 例外の送出 --- 222
    11.13.4 noexceptによる例外伝播の抑止 --- 224
    11.13.5 回復不能な異常と終了処理 --- 225
  11.14 日付や時間に関する機能 --- 228
    11.14.1 C言語由来の日付,時刻の処理 --- 228
    11.14.2 日付,時刻の文字列変換 --- 229
    11.14.3 時刻点と時間間隔 --- 230
  11.15 C言語標準ライブラリの利用 --- 233
    11.15.1 C言語由来の標準ライブラリ --- 233
    11.15.2 C++用ヘッダの読み込み --- 233
    11.15.3 std名前空間からの利用 --- 234
    11.15.4 拡張子 .h を持つヘッダとの違い --- 235
    11.15.5 C++で利用する際の注意 --- 235
12 クラスとオブジェクト --- 237
  12.1 クラスの定義 --- 237
  12.2 オブジェクトの独立性 --- 238
  12.3 アクセス指定 --- 239
    12.3.1 publicとprivate --- 239
  12.4 コンストラクタ --- 239
    12.4.1 コンストラクタのオーバーロード --- 241
    12.4.2 初期化の際の丸括弧と波括弧 --- 241
    12.4.3 暗黙の型変換を禁止するexplicit宣言 --- 243
    12.4.4 コピーコンストラクタ --- 243
    12.4.5 単純なバイトコピーが可能な型:trivially copyable --- 244
  12.5 デストラクタ --- 245
  12.6 thisポインタ --- 246
  12.7 constメンバ関数とmutable指定 --- 247
  12.8 演算子のオーバーロード --- 248
    12.8.1 複合代入演算子のオーバーロード --- 249
    12.8.2 異なる型の値との演算とその実装 --- 250
      12.8.2.1 friend関数 --- 251
    12.8.3 関数のように呼び出せるオブジェクト:operator() --- 251
  12.9 カプセル化 --- 253
    12.9.1 不変条件(インバリアント)の維持 --- 253
    12.9.2 インターフェースと実装の分離 --- 254
  12.10 メンバの静的宣言 --- 255
  12.11 friendによるクラス間の特別なアクセス --- 257
13 継承とポリモーフィズム --- 259
  13.1 継承とは何か --- 259
  13.2 継承の基本構文 --- 260
  13.3 基底クラスと派生クラス --- 261
  13.4 メンバの継承とアクセス制御 --- 261
  13.5 コンストラクタとデストラクタの呼び出し順序 --- 263
  13.6 関数の再定義と名前の隠蔽 --- 266
  13.7 仮想関数と動的束縛 --- 267
  13.8 ポリモーフィズム --- 268
    13.8.1 オブジェクトスライシング --- 270
  13.9 抽象クラスと純粋仮想関数 --- 271
  13.10 仮想デストラクタ --- 272
  13.11 継承設計に関する注意 --- 276
  13.12 C++におけるオブジェクトとオブジェクト指向プログラミング --- 276
14 オブジェクトの寿命と所有権 --- 278
  14.1 オブジェクトの寿命 --- 278
    14.1.1 オブジェクトの生成と破棄 --- 278
    14.1.2 スコープと寿命 --- 279
    14.1.3 関数から戻る際のオブジェクトの破棄 --- 279
    14.1.4 一時オブジェクトの寿命 --- 279
    14.1.5 静的記憶期間を持つオブジェクト --- 280
    14.1.6 動的に生成されたオブジェクトの寿命 --- 280
    14.1.7 寿命を終えたオブジェクトへのアクセス --- 280
  14.2 オブジェクトの所有権 --- 282
    14.2.1 所有と非所有 --- 282
      14.2.1.1 ポインタと所有権 --- 282
      14.2.1.2 所有権が不明確なポインタ --- 283
      14.2.1.3 参照による非所有の利用 --- 283
      14.2.1.4 関数の引数と所有権 --- 284
    14.2.2 単独所有と共有所有 --- 284
      14.2.2.1 単独所有 --- 284
      14.2.2.2 共有所有 --- 285
      14.2.2.3 単独所有と共有所有の使い分け --- 285
    14.2.3 所有権の移動 --- 285
      14.2.3.1 通常のポインタによる所有権の移動 --- 286
      14.2.3.2 コピーと移動の違い --- 286
      14.2.3.3 移動後のオブジェクト --- 286
      14.2.3.4 所有権の移動と単独所有 --- 287
  14.3 RAII --- 287
    14.3.1 RAIIによる資源管理 --- 287
    14.3.2 複数の終了経路とRAII --- 288
    14.3.3 ファイルの管理とRAII --- 288
    14.3.4 標準ライブラリとRAII --- 289
    14.3.5 RAIIを利用する際の基本方針 --- 289
  14.4 スマートポインタ --- 290
    14.4.1 単独所有のためのunique_ptr --- 290
      14.4.1.1 unique_ptrによる所有権の移動 --- 291
      14.4.1.2 unique_ptrを関数へ渡す方法 --- 291
    14.4.2 共有所有のためのshared_ptr --- 293
      14.4.2.1 shared_ptrによる所有権の解放 --- 293
    14.4.3 非所有の参照を表すweak_ptr --- 295
    14.4.4 共有所有における循環参照 --- 297
    14.4.5 スマートポインタを選ぶ際の基本方針 --- 298
  14.5 Rule of Three/Five/Zero --- 298
    14.5.1 特殊メンバ関数 --- 298
    14.5.2 Rule of Three --- 299
    14.5.3 コピーを禁止する方法 --- 301
    14.5.4 Rule of Five --- 301
    14.5.5 Rule of Zero --- 305
    14.5.6 Rule of Three/Five/Zeroの使い分け --- 305
15 クラス設計の実践 --- 306
  15.1 基本的なクラスの構成 --- 306
  15.2 小さなデータを表すクラス(値オブジェクト) --- 308
  15.3 リソース管理のためのクラス設計 --- 309
  15.4 抽象クラスによるインターフェース設計 --- 311
  15.5 ポリモーフィズムを前提とした設計 --- 313
  15.6 コンポジションによる設計 --- 315
  15.7 よくある設計上の問題 --- 317
  15.8 設計指針のまとめ --- 318
16 型を抽象化するための機能 --- 322
  16.1 関数テンプレート --- 322
    16.1.1 テンプレートにおける転送参照 --- 324
  16.2 クラステンプレート --- 326
  16.3 値を抽象化するテンプレート --- 329
    16.3.1 型の別名を定義する方法 --- 331
  16.4 変数テンプレート --- 334
  16.5 型安全な列挙型:enum class --- 335
17 ラムダ式 --- 337
  17.1 ラムダ式の基本 --- 337
    17.1.1 ラムダ式の即時呼び出し --- 338
  17.2 外部の変数の利用:キャプチャ --- 339
  17.3 ラムダ式の実体 --- 340
18 並行処理の基礎 --- 342
  18.1 並行処理の実行単位:thread --- 342
  18.2 スレッドの終了待ち:join --- 343
  18.3 スレッドの切り離し:detach --- 345
  18.4 スレッドの休止:sleep_for --- 346
  18.5 共有データとデータ競合 --- 347
    18.5.1 データ競合が発生する例 --- 348
    18.5.2 mutexによる排他制御 --- 350
      18.5.2.1 lock_guardによる安全なロック管理 --- 352
    18.5.3 atomicによる単純な共有値の操作 --- 353
19 プログラムの構成と分割 --- 357
  19.1 クラスの宣言とメンバ関数の定義 --- 357
    19.1.1 class文の外部におけるメンバ関数の定義 --- 358
    19.1.2 宣言と定義の一致 --- 358
  19.2 クラス定義と実装のファイル分割 --- 360
    19.2.1 クラス定義とメンバ関数定義の分離 --- 360
    19.2.2 ヘッダファイルを記述する際のC++固有の注意 --- 362
  19.3 名前空間に属する関数やメンバ関数の定義 --- 363
  19.4 ヘッダファイルに定義を記述する場合 --- 365
    19.4.1 inline関数 --- 365
    19.4.2 クラス定義内で定義されたメンバ関数 --- 366
    19.4.3 inline変数 --- 367
    19.4.4 定義の重複に関する注意 --- 367
  19.5 静的データメンバの定義 --- 369
  19.6 テンプレートの定義とファイル分割 --- 372
    19.6.1 テンプレートの定義を利用側から参照できる必要性 --- 372
    19.6.2 テンプレート定義の別ファイル化 --- 373
    19.6.3 明示的インスタンス化 --- 374
  19.7 C言語のプログラムとの連携 --- 377
    19.7.1 CとC++のリンケージの違い --- 377
    19.7.2 extern "C" --- 378
    19.7.3 CとC++の双方から利用する宣言 --- 378
    19.7.4 CとC++のオブジェクトファイルのリンク --- 379
■ 第3部 プログラムライブラリ --- 383
20 STLの基礎 --- 384
  20.1 要素数を変更できる配列:vector --- 384
    20.1.1 生成時の初期化 --- 385
  20.2 イテレータ --- 386
    20.2.1 要素を書き換えないイテレータ:const_iterator --- 388
  20.3 要素数が固定された配列:array --- 390
  20.4 双方向リスト:list --- 391
  20.5 両端キューのコンテナ:deque --- 393
  20.6 キーと値の対応を管理するコンテナ:map --- 394
    20.6.1 順序を管理しない高速な連想コンテナ:unordered_map --- 396
  20.7 重複のない値を管理するコンテナ:set --- 397
    20.7.1 順序を管理しない高速な集合コンテナ:unordered_set --- 398
  20.8 主なコンテナに対して使用できるメンバ関数 --- 400
    20.8.1 STLが提供するアルゴリズム --- 401
    20.8.2 コンテナ間の変換処理 --- 403
21 stringによる文字列処理 --- 407
  21.1 文字と文字列の検索 --- 407
  21.2 文字列の分割 --- 409
  21.3 文字の種類の判定と変換 --- 410
  21.4 日本語文字列と文字コードに関する注意 --- 412
  21.5 正規表現による文字列処理 --- 414
    21.5.1 正規表現の基本的な要素 --- 416
    21.5.2 正規表現に一致する箇所の全検索 --- 417
22 数値データの処理 --- 419
  22.1 乱数 --- 419
    22.1.1 乱数エンジン --- 419
    22.1.2 一様乱数 --- 422
      22.1.2.1 整数の一様乱数 --- 422
      22.1.2.2 浮動小数点数の一様乱数 --- 423
    22.1.3 正規分布に従う乱数 --- 424
    22.1.4 様々な乱数分布 --- 425
  22.2 数値列の集計:numeric --- 426
    22.2.1 総和と平均 --- 426
    22.2.2 分散と標準偏差 --- 427
    22.2.3 内積と累積和 --- 429
    22.2.4 連番の生成 --- 431
  22.3 複素数の扱い:complex --- 433
    22.3.1 実部,虚部 --- 433
    22.3.2 基本的な関数 --- 434
    22.3.3 複素数に対応する数学関数 --- 435
  22.4 多倍長精度演算 --- 437
    22.4.1 GMP --- 438
      22.4.1.1 GMPの主な型 --- 438
      22.4.1.2 GMPの主な関数 --- 439
      22.4.1.3 多倍長浮動小数点数の精度の設定と初期化 --- 442
      22.4.1.4 mpf_tの数学的な演算のための関数 --- 443
      22.4.1.5 比較,判定のための関数 --- 444
      22.4.1.6 mpf_t の値の近さの判定 --- 446
      22.4.1.7 書式整形と出力 --- 447
      22.4.1.8 サンプルプログラム(1):多倍長整数 --- 449
      22.4.1.9 サンプルプログラム(2):多倍長有理数 --- 450
      22.4.1.10 サンプルプログラム(3):多倍長浮動小数点数 --- 451
      22.4.1.11 mpz_t型の乱数 --- 451
      22.4.1.12 C++におけるGMPの利用 --- 454
    22.4.2 MPFR --- 463
      22.4.2.1 MPFRの主な型 --- 463
      22.4.2.2 オブジェクトの管理のための関数 --- 465
      22.4.2.3 値の設定と取得のための関数 --- 466
      22.4.2.4 演算のための関数(1):基本的な演算 --- 468
      22.4.2.5 比較,判定のための関数 --- 469
      22.4.2.6 mpfr_t の値の近さの判定 --- 470
      22.4.2.7 整数値への丸めに関する関数 --- 473
      22.4.2.8 演算のための関数(2):累乗・平方根など --- 474
      22.4.2.9 演算のための関数(3):指数関数,対数関数 --- 476
      22.4.2.10 演算のための関数(4):三角関数 --- 477
      22.4.2.11 演算のための関数(5):双曲線関数 --- 479
      22.4.2.12 演算のための関数(6):特殊関数,定数 --- 480
      22.4.2.13 MPFRのキャッシュの解放 --- 482
      22.4.2.14 mpfr_tの特殊な値 --- 483
      22.4.2.15 書式整形や入出力のための関数 --- 484
      22.4.2.16 mpfr_t型の乱数 --- 486
      22.4.2.17 10進桁数による精度の指定 --- 489
    22.4.3 MPC --- 491
      22.4.3.1 MPCの型とオブジェクトの管理 --- 492
      22.4.3.2 値の設定と取得 --- 493
      22.4.3.3 MPCの丸め方法 --- 495
      22.4.3.4 実部,虚部,絶対値,偏角 --- 495
      22.4.3.5 基本的な演算 --- 496
      22.4.3.6 累乗,指数関数,対数関数 --- 498
      22.4.3.7 三角関数,双曲線関数 --- 499
      22.4.3.8 書式整形と入出力 --- 501
      22.4.3.9 サンプルプログラム:1のn乗根 --- 503
■ 第4部 付録 --- 505
A 定義済みマクロ --- 506
  A.1 言語モードと規格に関するマクロ --- 506
  A.2 コンパイラとターゲット環境に関するマクロ --- 506
  A.3 ホスト実装とフリースタンディング実装 --- 507
B サンプルプログラム --- 511
  B.1 整数を2進数表記の文字列に変換する機能 --- 511
  B.2 高精度の時間計測(C言語用) --- 514
C コンパイラと開発環境 --- 517
  C.1 GCC --- 517
    C.1.1 基本的なコマンド書式 --- 517
    C.1.2 主なコンパイラオプション --- 518
    C.1.3 最適化水準 --- 519
    C.1.4 文字のエンコーディングの指定 --- 519
    C.1.5 実行時のスタックサイズの指定 --- 520
  C.2 Clang/LLVM --- 522
    C.2.1 LLVM IRとコンパイラの構成 --- 522
    C.2.2 clangとclang++の基本的な使用方法 --- 523
    C.2.3 主なコンパイラオプション --- 524
  C.3 MSVC(Microsoft Visual C++) --- 526
    C.3.1 必要となるツールの導入 --- 526
    C.3.2 MSVCを使用するためのコマンド環境の起動 --- 526
    C.3.3 clコマンド --- 527
    C.3.4 主なコンパイラオプション --- 528
    C.3.5 文字のエンコーディングの指定 --- 529
    C.3.6 実行時のスタックサイズの指定 --- 530
    C.3.7 開発ツールのアップデート --- 531
  C.4 MSYS2によるWindows開発環境 --- 532
    C.4.1 MSYS2のインストール --- 532
    C.4.2 MSYS2の起動 --- 532
    C.4.3 開発ツールのインストール --- 533
    C.4.4 パッケージの管理 --- 534
D ソフトウェア構築の支援ツール --- 535
  D.1 make --- 537
    D.1.1 基本的な使用方法 --- 537
    D.1.2 ソースファイルの変更に対するmakeの働き --- 540
    D.1.3 擬似ターゲット --- 541
  D.2 CMake --- 542
    D.2.1 基本的な使用方法 --- 543
    D.2.2 生成物の格納位置の設定 --- 547
  D.3 Ninja --- 548
    D.3.1 CMakeによるbuild.ninjaファイルの生成 --- 549
    D.3.2 Ninjaによる構築 --- 549
E 動的ライブラリの構築 --- 551
  E.1 動的ライブラリの基本的な仕組み --- 551
    E.1.1 公開シンボルと利用側プログラムとの結合 --- 552
    E.1.2 起動時の読込みと実行中の読込み --- 552
  E.2 公開インターフェースの設計 --- 552
    E.2.1 公開用ヘッダファイルとC ABI --- 553
    E.2.2 公開指定のためのマクロ --- 553
  E.3 例)数値集計ライブラリの実装 --- 554
    E.3.1 Cによるライブラリの実装 --- 555
    E.3.2 C++によるライブラリの実装 --- 556
    E.3.3 ライブラリを利用するプログラム --- 557
  E.4 環境別の動的ライブラリ構築 --- 558
    E.4.1 LinuxでGCCを使用する場合 --- 558
    E.4.2 LinuxでClangを使用する場合 --- 559
    E.4.3 macOSでClangを使用する場合 --- 559
    E.4.4 WindowsのMSYS2 UCRT64環境でGCCを使用する場合 --- 560
    E.4.5 WindowsのMSYS2 CLANG64環境でClangを使用する場合 --- 560
    E.4.6 WindowsでMSVCを使用する場合 --- 561
  E.5 公開インターフェース設計上の注意 --- 562
    E.5.1 ABI互換性の維持 --- 562
    E.5.2 メモリの管理とオブジェクトの寿命 --- 562
    E.5.3 C++例外の扱い --- 563
F gnuplot --- 564
  F.1 データファイルの形式 --- 565
    F.1.1 データファイルの区切り文字の指定 --- 565
  F.2 描画に関する各種のコマンド --- 567
    F.2.1 グラフの色の指定 --- 568
    F.2.2 線の太さの指定 --- 569
    F.2.3 線種の指定 --- 569
  F.3 描画結果の画像ファイルへの保存 --- 570
  F.4 ファイルに記述されたコマンドの実行 --- 571
  F.5 グラフに日本語を使用する際の注意事項 --- 572
  F.6 各種のグラフ --- 573
    F.6.1 マーカープロット(点グラフ) --- 573
    F.6.2 棒グラフ --- 574
    F.6.3 散布図 --- 576
    F.6.4 ヒストグラム --- 578
    F.6.5 3次元プロット(ワイヤーフレーム) --- 581
    F.6.6 ヒートマップ --- 583
    F.6.7 等高線 --- 585

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?