独習C++ 新版(高橋 航平 επιστημη(エピステーメー))|翔泳社の本
  1. ホーム >
  2. 書籍 >
  3. 独習C++ 新版

独習C++ 新版


監修

形式:
書籍
発売日:
ISBN:
9784798150239
定価:
3,718(本体3,380円+税10%)
仕様:
B5変・640ページ
カテゴリ:
プログラミング・開発
キーワード:
#プログラミング,#開発環境,#開発手法,#Web・アプリ開発
シリーズ:
独習
紙の書籍

標準教科書がC++17に対応し、
完全書き下ろしリニューアルで9年ぶりに新登場!

システム開発者、ゲームプログラマーをはじめ、
すべてのC++学習者、待望の解説書。

boostコミッターの著者により、
旧版の特徴である「扱う内容の深さは」そのままに、
より自然でわかりやすい解説に完全リニューアルしました。

言語仕様の初歩から標準ライブラリの基礎まで、
より丁寧で、より詳しい解説となった一冊です。

===目次===
- 第1章 C++の基本的な言語機能(1)
- 第2章 C++の基本的な言語機能(2)
- 第3章 クラス
- 第4章 分割コンパイル、ビルド
- 第5章 配列、ポインター、右辺値参照
- 第6章 演算子オーバーロード
- 第7章 継承
- 第8章 入出力システム
- 第9章 テンプレート
- 第10章 例外処理
- 第11章 実行時型情報とキャスト演算子
- 第12章 データ構造とアルゴリズム
- 第13章 文字列処理

C++を学ぶための”標準教科書”

本書の学習メソッド

わかりやすい【解説】

わかりやすい【解説】

C++のコア言語を中心とした基礎的な知識・概念・機能を、さまざまなサンプルプログラムを例示しながら詳細かつ丁寧に解説します。

理解が深まる【例題】

理解が深まる【例題】

学習する内容について、具体的な操作例やサンプルプログラム、実行結果などを示しています。実際に手を動かして、確認しながら学習を深めることができます。

力試しの【練習問題】

力試しの【練習問題】

各節末にある【練習問題】、章末にある【理解度チェック】で、学んだ事項を理解できたか確認できます。

第1章 C++の基本的な言語機能(1)
 1.1 Hello, world
 1.2 変数と関数
 1.3 演算子
 1.4 条件分岐
 1.5 組み込み型とポインター
 1.6 配列と文字列
 1.7 繰り返し
 この章の理解度チェック

第2章 C++の基本的な言語機能(2)
 2.1 構造体・共用体・列挙体
 2.2 クラス概要
 2.3 参照
 2.4 型推論
 2.5 型の別名定義
 2.6 コンソールからの入力
 2.7 関数オーバーロード
 2.8 ラムダ式
 この章の理解度チェック

第3章 クラス
 3.1 constメンバー関数とmutable
 3.2 コンストラクターとデストラクター
 3.3 初期値を受け取るコンストラクター
 3.4 デフォルトの初期値
 3.5 継承の概要
 3.6 オブジェクトポインター
 3.7 クラス、構造体、共用体の関係性
 3.8 フレンド関数の概要
 3.9 staticクラスメンバー
 この章の理解度チェック

第4章 分割コンパイル、ビルド
 4.1 識別子とC++のキーワード
 4.2 宣言と定義
 4.3 スコープ
 4.4 初期化構文付き条件分岐
 4.5 分割コンパイル
 4.6 インライン関数
 4.7 名前空間
 4.8 リンケージ
 4.9 プリプロセッサー
 この章の理解度チェック

第5章 配列、ポインター、右辺値参照
 5.1 配列とポインター
 5.2 オブジェクトの配列
 5.3 newとdeleteの使用
 5.4 newとdeleteの詳細
 5.5 {}による初期化とstd::initializer_list
 5.6 参照渡し
 5.7 参照を返す関数
 5.8 右辺値参照
 5.9 関数ポインターと関数リファレンス
 5.10 thisのキャプチャ
 5.11 関数ポインターに変換可能なラムダ式
 この章の理解度チェック

第6章 演算子オーバーロード
 6.1 演算子オーバーロードの基本
 6.2 算術演算子のオーバーロード
 6.3 項数の異なる算術演算子のオーバーロード
 6.4 ビット演算子のオーバーロード
 6.5 関係演算子と論理演算子のオーバーロード
 6.6 添字演算子のオーバーロード
 6.7 ポインター関連演算子のオーバーロード
 6.8 関数呼び出し演算子のオーバーロード
 6.9 フレンドな演算子オーバーロード
 6.10 代入演算子の詳細
 6.11 変換関数の作成方法
 この章の理解度チェック

第7章 継承
 7.1 アクセス制御
 7.2 継承時のコンストラクター/デストラクターの動作
 7.3 派生クラスへのポインター
 7.4 仮想関数の詳細
 7.5 多重継承
 7.6 仮想基底クラス
 7.7 派生、オーバーライドの抑止
 この章の理解度チェック

第8章 入出力システム
 8.1 C++の入出力の基礎
 8.2 書式設定された出力
 8.3 その他のテキスト入出力関数
 8.4 入出力マニピュレーターの使用
 8.5 ファイル入出力の基本
 8.6 書式不定のバイナリ入出力
 8.7 ランダムアクセス
 8.8 入出力状態のチェック
 この章の理解度チェック

第9章 テンプレート
 9.1 関数テンプレート
 9.2 クラステンプレート
 9.3 仮想関数とstaticメンバー
 9.4 特殊化
 9.5 型推論
 9.6 非型テンプレートパラメーター
 9.7 参照の推論と完全転送
 9.8 依存名
 9.9 可変引数テンプレート
 9.10 型特性
 9.11 ラムダ式の引数の型推論
 9.12 クラステンプレートのテンプレートパラメーターの型推論
 この章の理解度チェック

第10章 例外処理
 10.1 例外処理の基礎
 10.2 例外処理の詳細
 10.3 new演算子の例外処理
 10.4 標準例外
 この章の理解度チェック

第11章 実行時型情報とキャスト演算子
 11.1 実行時型情報(RTTI)
 11.2 キャスト演算子
 11.3 dynamic_castの利用
 この章の理解度チェック

第12章 データ構造とアルゴリズム
 12.1 コンテナクラス
 12.2 std::vector
 12.3 std::list
 12.4 タプル
 12.5 std::setとstd::map
 12.6 アルゴリズム
 この章の理解度チェック

第13章 文字列処理
 13.1 文字列処理の概要
 13.2 文字コード
 13.3 文字列操作
 13.4 数値・文字列間の変換
 13.5 正規表現
 この章の理解度チェック

付属データはこちら

会員特典はこちら

お問い合わせ

内容についてのお問い合わせは、正誤表、追加情報をご確認後に、お送りいただくようお願いいたします。

正誤表、追加情報に掲載されていない書籍内容へのお問い合わせや
その他書籍に関するお問い合わせは、書籍のお問い合わせフォームからお送りください。

利用許諾に関するお問い合わせ

本書の書影(表紙画像)をご利用になりたい場合は書影許諾申請フォームから申請をお願いいたします。
書影(表紙画像)以外のご利用については、こちらからお問い合わせください。

追加情報はありません。

ご購入いただいた書籍の種類を選択してください。

書籍の刷数を選択してください。

刷数は奥付(書籍の最終ページ)に記載されています。

現在表示されている正誤表の対象書籍

書籍の種類:

書籍の刷数:

本書に誤りまたは不十分な記述がありました。下記のとおり訂正し、お詫び申し上げます。

対象の書籍は正誤表がありません。

最終更新日:2024年03月15日
発生刷 ページ数 書籍改訂刷 電子書籍訂正 内容 登録日
1刷 006
[構文]複数変数の同時宣言
2刷
type-name variable-name1, variable-name2……; int main() { int a, b, c; // int型の変数、a,b,cを同時に宣言 }
type-name variable-name1, variable-name2……; (構文は上記1行のみ。以下は白地のコードです) int main() { int a, b, c; // int型の変数、a,b,cを同時に宣言 }

※リフローEPUBの場合、「1.2.1 変数とは」の2つ目の「構文」が該当箇所になります。
2019.11.26
1刷 015
練習問題1.2 1.の問題文のコード 下から2行目
2刷
// show_world()関数を呼び出す
// hello_world()関数を呼び出す
2020.06.19
1刷 035
練習問題1.4 2.の問題文
3刷
リスト1.9のdefaultラベルを削除して、省略した場合に何も表示されなくなることを確認してください。
リスト1.9の条件を1から3以外になるように変更したときに、defaultラベルを削除すると何も表示されなくなることを確認してください。
2020.11.27
1刷 080
練習問題2.1 3.のコード 下から3行目
2刷
u.x.y = 20;
u.s.y = 20;
2020.01.21
1刷 082
[構文]クラスメンバーのアクセス指定子:1行目
2刷
class /class-name/
class class-name
2019.11.26
1刷 096
練習問題2.4の2のプログラム 下から3行目
5刷
std::cout << e :: std::endl;
std:: cout << e << std:: endl;

リフローEPUBの場合、第2章「2.4.4 配列の型推論」内に該当箇所があります。
2023.10.13
1刷 099
リスト2.13 ネストした型名 8行目
4刷
void set_value(integer mew_value);
void set_value(integer new_value);
2022.03.03
1刷 129
リスト3.3
4刷
冒頭部分にて、以下のincludeディレクティブが抜けています
#include <iostream>
2022.06.28
1刷 143
実行結果
2刷
引数付きコンストラクター呼び出し 共通コンストラクター呼び出し alice
共通コンストラクター呼び出し 引数付きコンストラクター呼び出し alice

※リフローEPUBの場合、リスト3.6のすぐ後にある「実行結果」が該当箇所になります。
2020.01.28
1刷 151
構文「メンバー変数のデフォルト値」とその下の文章
5刷
構文:上から5行目 type-name variable-name(default-value); 文章:  この4通りの方法は変数の初期化のところで説明した4通りです。つまり、通常の変数の初期化と同様に扱うことができます(リスト3.10)。
構文:上から5行目 type-name variable-name(default-value); を削除します。 文章:以下の文章に差し替えます。  この3通りの方法は変数の初期化のところで説明した構文の内の3通りです。つまり、通常の変数の初期化とほとんど同様に扱うことができます。
2022.06.22
1刷 158
リスト3.13の実行結果の2行目
2刷
Derived::foo(42)
Derived::foo(int)
2020.04.28
1刷 174
リスト3.20 Aのコンストラクター定義内
2刷
// クラスのメンバー変数のようにアクセスできる std::cout << "&f: " << &f << std::endl << "&i: " << &i << std::endl; << "&l: " << &l << std::endl
// クラスのメンバー変数のようにアクセスできる std::cout << "&f: " << &f << std::endl << "&i: " << &i << std::endl << "&l: " << &l << std::endl;

「;」の位置を修正しました。
2019.11.05
1刷 174
リスト3.20 get_iメンバー関数の定義
2刷
float A::get_i() const { return i; }
int A::get_i() const { return i; }
2019.11.05
1刷 175
実行結果
2刷
&f: 0x7fffae024400 &i: 0x7fffae024400 &l: 0x7fffae024408 deadbeef 402df84d
&f: 0x7fffae024400 &i: 0x7fffae024400 &l: 0x7fffae024408 i: deadbeef i: 402df84d l: c0fee

※リフローEPUBの場合、リスト3.20の「実行結果」が該当箇所になります。
2020.10.02
1刷 226
「using宣言」下から2行目
5刷
using module::submodule::featureA();
using module::submodule::featureA;

リフローEPUBの場合、第4章「4.7.3 名前空間の省略」内に該当箇所があります。
2023.08.28
1刷 243
リスト4.26および続く解説文
2刷
#include <iostream> #define PLUS(a, b) (a + b) // 加算をする関数形式マクロ #define HOGE int main() { #if PLUS(defined(HOGE), 0) std::cout << "PLUS(defined(HOGE), 0)はtrueです。" << std::endl; // ① #else std::cout << "PLUS(defined(HOGE), 0)はfalseです。" << std::endl; // ② #endif } [実行結果] PLUS(defined(HOGE), 0)はfalseです。 #if の条件式に関数形式マクロを使っていますが、最初にこのマクロ展開が行われ次のようになり ます。 #if (defined(HOGE) + 0) このとき HOGE というマクロが定義されているので defined(HOGE) は 1 となり、(1 + 0) を計算 すると 1 になるので、この条件文は true となり①のプログラムが有効となります。
#include <iostream> #define HOGE int main() { #if defined(HOGE) std::cout << "defined(HOGE)はtrueです。" << std::endl; // ① #else std::cout << "defined(HOGE)はfalseです。" << std::endl; // ② #endif } [実行結果] defined(HOGE)はfalseです。 このとき HOGE というマクロは(中身が空であっても)定義されているので defined(HOGE) は 1 となり、この条件文は true となり①のプログラムが有効となります。

2刷で上記内容に修正しましたが、実行結果に誤りがありました。大変申し訳ありません。
正しくは以下の内容になります。

defined(HOGE)はtrueです。
2019.11.26
1刷 266
実行結果
2刷
42
生命、宇宙、そして万物についての究極の疑問の答え: 42

※リフローEPUBの場合、リスト5.11の「実行結果」が該当箇所になります。
2020.10.02
1刷 269
リスト5.13 Objectクラスの宣言
2刷
class Object
{
    std::string name;

public:
    Object() : object("NO NAME") { }
    explicit Object(std::string name) : name(name) { }
    ~object();
    void show_name() const;
};
class Object
{
    std::string name;

public:
    Object() : Object("NO NAME") { }
    explicit Object(std::string name) : name(name) { }
    ~Object();
    void show_name() const;
};


「object」を「Object」に修正しました(2か所)。
2019.11.05
1刷 273
リスト5.15 キャプション
2刷
リスト5.15 std::initialiser_listの使用例
リスト5.15 std::initializer_listの使用例
2019.11.25
1刷 274
リスト5.15 コンストラクター定義
2刷
// std::initializer_listを受け取るコンストラクター
int_vector::int_vector(std::initializer_list init)
    : m_size{init.size()}, m_array{new int [init.size()]}
{
    // std::initializer_listの中身を使って動的配列を初期化する
    for (std::size_t i = 0; i < init.size(); ++i)
    {
        array[i] = init[i];
    }
}

int_vector::~int_vector()
{
    delete [] array;
}
// std::initializer_listを受け取るコンストラクター
int_vector::int_vector(std::initializer_list init)
    : m_size{init.size()}, m_array{new int [init.size()]}
{
    std::size_t i = 0;
    // std::initializer_listの中身を使って動的配列を初期化する
    for (int e : init)
    {
        m_array[i] = e;
        i += 1;
    }
}

int_vector::~int_vector()
{
    delete [] m_array;
}

本書2刷で上記のように修正しましたが、内容にもれがありました。
申し訳ございません。
以下の修正を追加いたします。

「// std::initializer_listを受け取るコンストラクター」の下のコード
誤:int_vector::int_vector(std::initializer_list init)
正:int_vector::int_vector(std::initializer_list<int> init)
2019.11.25
1刷 287
リスト5.24 上から13行目
person(person&& ohter);
person(person&& other)
2024.03.15
1刷 316
リスト6.5 下から3行目
2刷
auto v = ~(x ^ y) | (z & x)
auto v = ~(x ^ y) | (z & x);

コード末尾に「;」を追加しました。
2019.11.05
1刷 317
リスト6.6 operator==関数の定義内
2刷
return value == other.value;
return value == rhs.value;
2019.11.05
1刷 320
リスト6.7 7行目
3刷
return value != 0;
return value == 0;

※リフローEPUBの場合、13行目が該当箇所になります。
2020.11.27
1刷 333
リスト6.14 2つ目のoperator-()関数の定義
2刷
Integer operator-(int lhs, const Integer& rhs) { return Integer{ lhs - rhs, rhs.value }; }
Integer operator-(int lhs, const Integer& rhs) { return Integer{ lhs - rhs.value }; }

, を . に修正しました。
2019.11.05
1刷 339
リスト6.17 冒頭
2刷
class heap {
#include <iostream> class heap {
2019.11.05
1刷 342
リスト6.18 main()関数内
2刷
// OK。vector4dのフレンド関数である演算子オーバーロードが呼ばれる(②) vector4d b = v1 + v2;
// OK。vector4dのフレンド関数が呼ばれる(②) vector4d b = add(v1,v2);

※リフローEPUBの場合、リスト6.18の末尾、下から3~2行目が該当箇所になります。
2019.11.05
1刷 354
リスト7.3 7行目
2刷
std::cout << "A引数付きコンストラクラター: " << i << std::endl;
std::cout << "Base引数付きコンストラクター: " << i << std::endl;
2020.05.11
1刷 373
リスト7.14内
2刷
// DerivedAは仮想基底クラスとしてBaseを継承する class DerivedA : virtual public A { public: void method_DerivedA() { std::cout << "DerivedA: " << this << std::endl; } }; // DerivedBは仮想基底クラスとしてBaseを継承する class DerivedB : virtual public A { public: void method_DerivedB() { std::cout << "DerivedB: " << this << std::endl; } };
// DerivedAは仮想基底クラスとしてBaseを継承する class DerivedA : virtual public Base { public: void method_DerivedA() { std::cout << "DerivedA: " << this << std::endl; } }; // DerivedBは仮想基底クラスとしてBaseを継承する class DerivedB : virtual public Base { public: void method_DerivedB() { std::cout << "DerivedB: " << this << std::endl; } };
2019.11.05
1刷 397
リスト8.7の実行結果
5刷
abcde
上記の行を削除

リフローEPUBの場合、第8章「8.5.2ファイルオープンのモードフラグ」内に該当箇所があります。
2023.08.28
1刷 397
リスト8.7
2刷
out.open{"hello_file.txt", std::ios::out | std::ios::trunc};
out.open("hello_file.txt", std::ios::out | std::ios::trunc);

カッコ「{}」を「()」に変更しました。

本書2刷で上記のように修正いたしましたが、誤りでございました。
申し訳ございます。正しくは下記の通りです(2023.12.22)。
誤:
out.open("hello_file.txt", std::ios::out | std::ios::trunc);
正:
out.open("hello_file.txt", std::ios::trunc);

2019.11.05
1刷 399
リスト8.9 冒頭
2刷
#include <iostream> #include <fstream>
#include <iostream> #include <fstream> #include <string>
2019.11.05
1刷 401
リスト8.10
2刷
#include <fstream> int main() { std::ofstream out{"hello_binary.bin", std::ios::binary}; // 人間が文字として認識できない数値を直接出力 out.put(1); // ストリームが返されるのでこのように連続して呼ぶことができる out.put(2).put(3); out.close(); char a, b, c; std::ifstream in{"hello_binary.bin", std::ios::binary}; // 1バイトを直接入力 in.get(&a); in.get(&b).get(&c); // get()関数も同様に連続して呼べる std::cout << "a: " << a << std::endl; std::cout << "b: " << b << std::endl; std::cout << "c: " << c << std::endl; }
#include <fstream> #include <iostream> int main() { std::ofstream out{"hello_binary.bin", std::ios::binary}; // 人間が文字として認識できない数値を直接出力 out.put(1); // ストリームが返されるのでこのように連続して呼ぶことができる out.put(2).put(3); out.close(); char a, b, c; std::ifstream in{"hello_binary.bin", std::ios::binary}; // 1バイトを直接入力 in.get(a); in.get(b).get(c); // get()関数も同様に連続して呼べる std::cout << "a: " << a << std::endl; std::cout << "b: " << b << std::endl; std::cout << "c: " << c << std::endl; }

本書2刷で上記のように修正いたしましたが、下から4行目のコードにも誤りがございました。申し訳ございません(2023.12.22)。

誤:
std::cout << "a: " << a << std::endl;
std::cout << "b: " << b << std::endl;
std::cout << "c: " << c << std::endl;
正:
std::cout << ""a: "" << static_cast(a) << std::endl;
std::cout << ""b: "" << static_cast(b) << std::endl;
std::cout << ""c: "" << static_cast(c) << std::endl;
2019.11.05
1刷 417
リスト9.2の実行結果 1行目
5刷
7
5

リフローEPUBの場合、第9章「9.1関数テンプレート」内に該当箇所があります。
2023.08.28
1刷 426
リスト9.7 一番下
2刷
static_cast<Base&>(di).foo();
static_cast<Base&>(di).foo(0);

※リフローEPUBの場合、リスト9.7の末尾から4行目が該当箇所になります。
2019.11.05
1刷 432
リスト9.10
2刷
// 2次元ベクトルクラスで明示的特殊化したテンプレート // 前方宣言があればプライマリテンプレートがなくても特殊化はできる template <> void show_vector<Vec2>(Vector v)
// 2次元ベクトルクラスで明示的特殊化したテンプレート // 前方宣言があればプライマリテンプレートがなくても特殊化はできる template <> void show_vector(Vec2 v)

<Vec2>を削除して、VectorをVec2に修正しました(同じ行内で2か所修正)。
2019.11.05
1刷 438
リスト9.14 fused_multiply_add関数内
2刷
return a * b + c
return a * b + c;
2019.11.05
1刷 492
note1行目
5刷
std:bad_array_new_length例外
std::bad_array_new_length例外

リフローEPUBの場合、第10章「10.3.2 std::bad_array_new_length例外」内に該当箇所があります。
2023.08.28
1刷 536
練習問題12.2 「3」の問題文
1.で初期化した
2.で初期化した
2024.03.12
1刷 dl-026
121ページの「この章の理解度チエック」の4の回答 「リストApp2.17」の7行目
vec.setZ(z);
vec.setZ(z); return vec;

「この章の理解度チエック」の4の回答
「リストApp2.18」の7行目も同様に修正します。
2024.01.22
2刷 244
リスト4.26の実行結果
3刷
defined(HOGE)はfalseです。
defined(HOGE)はtrueです。
2021.09.28
2刷 274
リスト5.15 11行目
5刷
int_vector::int_vector(std::initializer_list init)
int_vector::int_vector(std::initializer_list<int> init)

※リフローEPUBの場合、リスト5.15内のコメント「// std::initializer_listを受け取るコンストラクター」のすぐ下の行が該当箇所になります。

2023.07.14内容更新
2022.06.07
2刷 397
リスト8.7 上から8行目
5刷
out.open("hello_file.txt", std::ios::out | std::ios::trunc);
out.open("hello_file.txt", std::ios::trunc);

リフローEPUBの場合、第8章「8.5.2 ファイルオープンのモードフラグ」内に該当箇所があります。
2023.08.28
2刷 401
リスト8.10 下から4行目
5刷
std::cout << "a: " << a << std::endl; std::cout << "b: " << b << std::endl; std::cout << "c: " << c << std::endl;
std::cout << ""a: "" << static_cast(a) << std::endl; std::cout << ""b: "" << static_cast(b) << std::endl; std::cout << ""c: "" << static_cast(c) << std::endl;

リフローEPUBの場合、第8章「8.6.1 1バイトの入出力」内に該当箇所があります。

内容を更新しました(2023.12.22)。
2023.08.28

感想・レビュー

ryo さん

2021-01-21

c++17規格に対応した独習シリーズの一つ。基本的な文法からクラスやテンプレートなどc++の標準的な知識が抑えてある。会社の研修で使用。研究室でのコーディングでは意識しなかった保守性や信頼性の観点のもと、クラスの使い方に馴染む必要があった。その目的はある程度満たすことができたように思う。演習の答えはネット上にアップされており、まさに独習するのに不便はない。演習は項目ごとに絞っているので解きやすさはある反面、体系的な知識を駆使して一定の成果物を完成させるにはまた別の訓練が必要。入口としては良書と言える。