書影
矢吹太朗『Microsoft Visual C++入門』(日経BPソフトプレス, 2009) 追記:改訂版があります.

「C++の入門書はすでにたくさん出版されているのに何をいまさら」と思うかもしれませんが、本書は以下のような点で類書との差別化を図っています。

  • 国際標準のC++と、Microsoftが.NETのために開発したC++/CLIの両方を扱っています。言語の各機能について、まず標準C++について説明し、その後でC++/CLIについて補足的に説明するという構成を取っているため、本書は標準C++の解説書としても使えます(本書のコードの大部分はGCCでもコンパイル・実行できます)。
  • オブジェクト指向にこだわっていません。C++は宣言的記述やジェネリックプログラミング、関数プログラミング、メタプログラミングなどをサポートするマルチパラダイムプログラミング言語です。複数のプログラミングパラダイムを一つの言語で学ぼうとするなら、C++は最良の言語の一つです。(C++以外では、Mathematicaでしょうね)
  • .NETのクラスライブラリよりも標準テンプレートライブラリ(STL)を重視しています。STLは.NETよりも強力なコンテナとアルゴリズムを備えているからです。「C#はC++から難しい部分を取り除いた新しい言語だ」などという話がありますが、失われたものはかなり大きいのです。STLは、データと操作の抽象化方法つまりプログラムを書き方を学ぶ最良の教材の一つです。
  • 並列プログラミングを紹介しています。CPUのマルチコア化が進む現状を考えると、並列プログラミングについての知識はこれからますます重要になっていくはずですが、入門書ではあまり扱われません。C++はOpenMPという既存のコードを少し修正するだけで使える高度なAPIをサポートしているので、初心者でも簡単に並列プログラミングを行えます。

もともと私は、まずMathematicaのような高級言語でプログラムを書いて、速度が必要なときはC++で書き直すということをよくしていたのですが、こうしてまとめてみると、いきなりC++で書いてもよい領域がたくさんあると思いました(それでも、WebアプリのロジックをC++で書く必要ははないでしょう)。

「プログラムの実行にかかる時間より、プログラムを書くのにかかる時間のほうが貴重だ」という領域もあり、そういう領域ではC++を使うべきではないということが言われますが、必ずしもそうではないでしょう。実際、C++を知らないC#やJavaのプログラマが本書を読めば、C#やJavaがいかに多くのものを失ってしまったかがわかるかと思います。

プログラムの実行にかかる時間が貴重な場面では、選択肢はあまり多くありません。スパコンではいまだにFortranが第1の言語で、C言語やC++のシェアはあまり大きくないでしょう。PC(クラスタ)の場合には状況が違っていて、C++も十分使えます。先に紹介したOpenMPを使える言語はFortranとC言語、C++だけですが、この3つの中ではC++が最も高級です。

C++は歴史のある言語ですが、時代遅れの言語ではありません。さまざまな領域で使われ続けており、C++が唯一の選択肢であるような領域もたくさんあります。また、その進化も止まってはおらず、近いうちに現在の標準C++の次の規格であるC++0xが定まるでしょう(C++0xについても本書の中で「C++0xでは・・・という書き方ができるようになる予定です」のような形式でコメントしています)。

最後に「文法からはじめるプログラミング言語」というシリーズ名について。本書は文法書ではありません。BNFなどは使っていません。K&Rのスタイルをなんとなく踏襲したオーソドックスな本です。おそらく、GUI構築が大部分を占める日経BPソフトプレスの他のシリーズとの違いを明確にしようとしてこういうシリーズ名になったのでしょうが、内容は『英文法入門』に期待されるものではなく、『英語入門』に期待されるものになっています。

正誤表

196 for (it=vec.begin(); it!=vec.end(); ++it) cout<<it<<' '; for (it=vec.begin(); it!=vec.end(); ++it) cout<<*it<<' ';
233 typedef 引数の型 (*関数ポインタの型名) (関数のパラメータリスト); typedef 戻り値の型 (*関数ポインタの型名) (関数のパラメータリスト);