これならわかるC++

2001年5月20日発売 440ページ 1900円+税
講談社発行 小林健一郎著
(ブルーバックス CD-ROM付)

 

 プログラミングそのものの初心者を対象にしたC++プログラミングの入門書です。

  実際にプログラミングをしながら、考え方を説明する

よう工夫しているつもりです。これはまた、「C++入門のホームページ」にある「C++入門」の製品版と考えることができますが、扱っている内容は一部を除いて異なり(Nekoは出てきます^^;)、基本的には書き下ろしです。さらに、

 図を豊富にした
 新しいライブラリを使っている
 BorlandC++5.5コンパイラがついている

が、特徴になっています。「C++入門」を読んだ人もぜひ手に取って見てください。^^)

第1部 クラスで遊ぼう
 第1章 プログラムを書いてみよう
  1.1 プログラミングの流れ        −ソース、コンパイル、リンク
  1.2 画面に字を書こう          −cout
  1.3 ユーザに質問しよう         −cin
  1.4 名前と年齢を聞く          −string
  1.5 関数を作る              −プログラムの部品
 第2章 クラスを書こう、オブジェクトを使おう
  2.1 猫の設計図             −クラス
  2.2 猫を作って鳴かそう        −オブジェクト
  2.3 名前付きで生まれてくる猫    −コンストラクタ
  2.4 名前付きの猫と名前なしの猫  −デフォルトコンストラクタ
 第3章 ロケットシミュレーション1
  3.1 ロケットを作る            −クラスの例
  3.2 加速を繰り返す           −for文
  3.3 誤入力を処理する         −if文
  3.4 ロケットの作り方          −複数のコンストラクタ
 第4章 ロケットシミュレーション2
  4.1 ロケットの燃料の残量を知る   −値を戻す関数
  4.2 ジェットの限り            −while文
  4.3 冒険の終わるとき          −デストラクタ
  4.4 関数定義を別に書く        −メンバ関数の定義
  4.5 クラスと暮らす            −privateとpublic
 第5章 魔王と戦う英雄
  5.1 電子のサイコロ           −乱数
  5.2 魔王を作る              −主要クラス
  5.3 英雄を作る              −ふたつのクラス間の関係
  5.4 クラスの中のクラス         −ゲームクラス
  5.5 戦いが終わるとき          −privateなメンバ関数
  5.6 攻撃にバラエティを         −オブジェクトを渡す
第6章 プログラムの実行中に...
  6.1 あなたのアドレスを教えて     −ポインタ
  6.2 猫を作ったり消したり        −newとdelete
  6.3 猫の作り方いろいろ         −newとコンストラクタ
  6.4 たくさんの猫たち           −配列
第7章 オブジェクト指向プログラミング
  7.1 サラリーマンは人間から作る    −継承(派生)
  7.2 手続きは自動で            −仮想関数
  7.3 はじめから継承            −コードを整理するための継承
  7.4 資産家も仲間入り           −純粋仮想関数
  7.5 みんなの代わり            −参照(リファレンス)

第2部 テンプレートで遊ぼう
 第8章 いろいろな悪者と戦う英雄
  8.1 魔王再び                −テンプレート
  8.2 新たなる敵               −テンプレートの応用例
  8.3 英雄も成長する            −テンプレートのパラメータ
 第9章 名簿を作ろう
  9.1 たくさんの整数             −vector
  9.2 たくさんの人              −vectorとオブジェクト
  9.3 ファイルの読み書き          −ofstreamとifstream
  9.4 名簿クラス                −クラスをまとめる
  9.5 名簿クラスのその後          −erase、clear、insert
 第10章 整列させるプログラム
  10.1 整数の整列              −配列とsort
  10.2 名前の整列              −vectorとsort
  10.3 人データの整列            −自作データの整列
  10.4 「位置」について            −反復子(イテレータ)
  10.5 参考                   −listとメンバ関数のsort
 第11章 文字列のいろいろ
  11.1 CとC++の文字列          −文字配列とstring
  11.2 文字列の中から文字列を探す    −stringのfind
  11.3 指定したファイルを開く        −c_str
  11.4 1行まるごと入力            −getline
  11.5 全部まとめて              −文字列検索プログラム

第3部 脱初心者
 第12章 ポインタをデータメンバに持つクラス
  12.1 データをもらう             −コピーと代入
  12.2 2度消しにご注意           −複数のポインタ
  12.3 自分でコピー・代入          −コピーコンストラクタと代入演算子
  12.4 別の処理                −コピー・代入の禁止
 第13章 自分でt来る連結リスト
  13.1 ノードクラスを作る           −連結リストの要素
  13.2 リストクラス               −ノードをまとめるクラス
  13.3 データを順番に取り出す       −反復子(イテレータ)
 第14章 これから
  14.1 C++プログラミングの指針
  14.2 これからどうするか

付録1 Borland C++ Compiler 5.5簡易インストールガイド
付録2 コンパイラの基本的な使い方


訂正/補足
いくつか訂正が発生しました。すみません。m(__)m
以下を参照してください。
読者の方々からもミスプリのご指摘を受けています。ありがとうございました。

第1刷で見つかったもの(第2刷以降では訂正・補足されています)

訂正p5
第1刷では、最後の行に「新しいライブラリに関する記述は含まれていません。」とありますが、これは、「新しいライブラリに関する記述は、ホームページ版には含まれていません。」という意味でした。 第2刷で訂正しました。

補足p90
コード3.2.3(CD-ROMではcode3_2_3.cpp)では、ロケットの「噴射量」を「加速量」とよんでいます。この本では、ロケットの「加速量」という言葉があれば、それは「噴射量」と同じと考えてください。第2刷でそのようにコメントを入れました。

第2刷で見つかったもの(第3刷では訂正・補足されています)

訂正p147中程
「攻撃が命中すると魔王は、ひとつ横に逃げるか...留まります。」という文が繰り返しています。どちらかを削除してください。

訂正p.199のコード6.3.2の5行目
「{ コード6.3.1と同じ };」の;は不要でした。(あってもエラーにはなりませんが。^^;)

訂正p227中段7行目から12行目まで
「ここで使っている...かもしれないからです。」の記述はややあいまいでした。以下のように直してください。
「ここで使っているクラスのオブジェクトには「特別な後始末」が必要ないので、そのようなコードは書かれていません。しかし、派生クラスのデストラクタに「特別な後始末」が書いてあるかもしれません。その意味でも、派生クラスのオブジェクトは派生クラスのオブジェクトとして破棄されるべきなのです。」

訂正p258の図8.2.2
コンストラクタの最後の「{ }」がその前の部分と少し重なって見えます。ここは
 ...power(10){}
です。

補足p267
図9.1.1に「data[0]などの(意味のある)要素が生成されるのはpush_back(など)が実行されてからです」というキャプションを付け加えてください。

訂正p.277のコード9.2.2の5行目
「classs」は「class」でした。

訂正p.280の9行目
「size type」は「size_type」でした。

訂正p.301ページのコード9.5.2の1行目
「vector <Hito>:size_type n;」は「vector<Hito>::size_type n;」でした。コロンが2つです。

訂正p351
下から6行目の「yのデータに代入されます」は「zのデータに代入されます」でした。

訂正・補足:p362の最後に以下の文章を挿入してください
実は、p358およびコード12.3.1で使った代入演算子の定義は完全ではありません。このままの定義では、「z = x;」のような代入が行われるときに、zがもともと指していたAruオブジェクトがそのまま残されてしまうからです。メモリの無駄遣いを避けるためには、このオブジェクトを破棄しておく必要があります。それはたとえば次のようなコードになります。

Betu& Betu::operator=(const Betu& m){
    if(this == &m) return *this;
    delete p;     //前のオブジェクトを破棄
    p = new Aru;
    *p = *(m.p);
    return *this;
}
ここで最初の「if(this == &m) return *this;」は、「z = z;」のような自己代入を避けるためのものです。thisは自分のアドレスで、&mは右辺のオブジェクトのアドレスなので、これらが等しいときは何もしないで終了するのです。
(第3刷では、コード12.3.1そのものを上のように変更し説明を増やしました。)

第3刷で見つかったもの(第4刷り以降では訂正されています)

●訂正p274の構文中
int x = data.size();
とありますが、xの型は正確にはintではありません。
その説明は構文下にあります。そこで、このintは取って、「xの型は次のページの構文で説明しています」という記述を入れてください。
(p274の例では、正確には「vector<int>::size_type x = data.size();」です。)

●訂正p335、p344、p345、p387
findで「文字列が見つからなかった合図」を「-1」と書きました。しかし、正確にはライブラリで定義されたstring::nposというもの(ある値)がその「合図」になっています。これは、私のBC++、VC++のライブラリでは-1と定義されているものですが、いつでもどこでも保証されているわけではありませんでした。m(__)m。したがって、

p335の7行目、9行目、構文5行目、p345の1行目、5行目、6行目の「-1」を「string::npos」に直してください。

p344のコード11.5.1の下から7行目の「if(data[i].find(temp) != -1){」は「if(data[i].find(temp) != string::npos){」に直してください。

また、文字列中の文字の位置を表す整数の型も正確にはintではなく、string::size_typeです。そういう型が定義されているのです。(「-1」という値を使わないので、)p334のコード11.2.1、p335のコードの「int pos;」も「string::size_type pos;」に直してください。

p387のコード13.3.2の下から8行目を「if((iter.GetData()).find(temp) != -1){」から「if((iter.GetData()).find(temp) != string::npos){」に直してください。

●訂正p407の1行目
誤: C:\Borland\Bcc\Bin
正: C:\Borland\Bcc55\Bin
(その後の解説部分では正しくなっています。)

第4刷で見つかったもの(第5刷り以降では訂正されています)

●訂正p213のコード7.1.3の下から2行目
「string temp;」は不要でした。(あってもエラーにはなりません。tempが使われていないだけです。)
執筆段階での推敲で、不要部分を削除し忘れたようです。お恥ずかしいです。^^;)

第5刷で見つかったもの

訂正p113のコード4.1.1の2行目
●訂正p121のコード4.3.1の11行目
誤 void Report(){
正 void Report() const {
Reportはデータを変えない関数なのでconstを付けるべきものでした。コード4.4.1でconstが復活するのですが、ここでは書き忘れています。constがなくてもエラーにはなりませんが、付けるべきものです。すみません。m(__)m

訂正p216のコード7.1.4の6行目
「int GetPlus(){ return plus; }」はデータを変えない関数なので、「int GetPlus() const{ return plus; }」とすべきでした。constがなくてもエラーにはなりませんが、付けるべきものです。

●訂正p232のコード7.4.2の6行目
「int GetSavings(){ return savings; }」はデータを変えない関数なので、「int GetSavings() const{ return savings; }」とすべきでした。これも上と同様です。m(__)m

第10刷で見つかったもの

●補足p.240の2行目
参照変数という言葉を使ってしまいました。これは、一般に、&付きで定義し、「他の変数の代わりにする変数」のことです。
今の場合、xは引数をそのまま扱うための変数、つまり、引数の代わりにする変数なので、参照変数ということもできるのです。

●訂正p.271のコード9.1.2の7行目
説明文の「10を格納しています」は、「0を格納」でした。

●訂正p.387のコード
「iter.GetData()のなかにtempがあるか?」というコメントで下のコードが見えなくなっていました。
また、iを増やすために、「i++;」のようなコードが必要です。
この「int i = 0;」以下のfor文をちゃんと書くと次のようになります。

for(SListIter<string> iter(data); iter.IsNotDone() ; iter.Next()) {
    if((iter.GetData()).find(temp) != string::npos){
        cout << i << " : " << iter.GetData() << endl; 
    }
    i++;
}

はじめにも書きましたが、多くの訂正箇所は読者の方からのご指摘により見つかっています。
ご指摘いただいた方々に感謝いたします。ありがとうございます。
もちろん、ときどきいただく「励まし」のメールにも感謝いたします。ありがとうございます。

 

●補足(第5刷以降には掲載されています)
 WindowsXPへのBorlandC++のインストールについて

WindowsXPでの動作確認を完全にしたわけではありませんが、XPはこれまでのWindowsの後継OSなので、理論的にはXPでもBorlandC++は使えると思います。実際、私が使っている限りでは問題ありません。(例によって、保証はできませんが。^^)

付録1の2で、PATHの設定方法を説明していますが、WindowsXPの場合、次のようにすればPATHが設定できます。
まず、デスクトップ上の[マイコンピュータ]を右クリックし、[プロパティ]を選び、[システムのプロパティ]ダイアログを開きます。
次に、そのダイアログで[詳細設定]のタブをクリックし、さらに[環境変数]のボタンを押し、[環境変数]ダイアログを開きます。

このダイアログの下の欄で[Path]を選び、下の[編集]のボタンを押し、[システムの編集]ダイアログを開きます。

ここで、すでに書いてある変数値を消さないように注意して、その最後に「;C:\Borland\Bcc55\Bin」を付け加え、[OK]ボタンを押し終了します。上の画像に見えている「ROOT〜WBEM」はあくまで私の環境のものであって、みなさんのものとは異なるはずです。みなさんの環境では、単に、「;C:\Borland\Bcc55\Bin」を付け加えるだけにして、他の部分は変更しないようにしてください。
そして、すべてのダイアログを[OK]ボタンで閉じ、最後にパソコンを再起動します。

総目次へ

Eメール to 小林健一郎