本書は、C 言語はある程度使ったことがあり、C++ を独学で学び始めた人が、やるべきではないことをいとも簡単にやってしまう状況を少し改善したいと思って書きました。 コンパイルは通るけれど、明らかにバグっている、メンテナンス性が悪い、性能面で問題があるコードを書かずに済むようになって欲しいという気持ちが込められています。
C++ は歴史が長いからなのか、とにかく仕様が複雑で大量にあります。 仕様を全部理解しないと C++ を使ってはいけないなんてことはありません。 脳味噌の容量は有限なのです。 C++ を牽引発展させていく人達はそういうわけにもいかないでしょうが、単に良いプログラムを書きたくて C++ を使おうとする我々にとっては、出来るだけ少ない知識で、必要十分に便利な機能を使いこなすのが理想です。 逆に、仕様で許されているからといって、やって良い、やるべき、とはならないことが多いのが初心者にとって辛いところだと思います。
本書は C++ をまったく書いたことがない人向けではありませんので、網羅性についてはあまり重視していませんし、キーワードをいちいち説明していないこともありますので、適宜ご自分で調べてください。 本書では、何故そう書くか、何故そうすべきなのかについて、特に私が強く思っていることを書きます。 もちろん、全ての C++ プログラマが同意するような完璧なものではないと思いますが、私の C++ コードを書いたりレビューしたりのつたない経験から得たひとつの解釈ではありますので、参考にしてもらえれば幸いです。
以下の項目の一部または全部に「はい」と答えてしまう人は、本書を読むべきだと思います:
- 動的メモリ確保といえば、
malloc
かnew
を使ってやるものだ。 - RAII という言葉を聞いたことがない、聞いたことあるけどよく分からない。
- 変数のスコープや寿命、所有や借用を意識してコードを書いていない。
- ポインタと参照の違いが良く分からない。
T&
とT&&
の違いが良く分からない。- const を使ったことがない、あまり使わない、その良さが良く分からない。
本書では、主に C++11 でサポートされる機能を対象にします。 場合によっては C++14、 C++17、C++20 について言及します。 サンプルコードは、比較的最近の GCC もしくは Clang でコンパイルできることを確認していますが、include 宣言などを省略したりしているので適宜追加してください。
C 言語はある程度使ったことがある人を対象にしていますので、C FAQ を眺めて復習してきてください。 C++ のオンラインマニュアルとしてオススメなのは、cppreference です。 日本語であれば cpprefjp を挙げておきます。 サンプルコードを書いて実行してみたり、コンパイラによって出力されるアセンブラコードやバイナリコードを見てみることをオススメします。 さらに詳しい挙動を知りたい場合は、C++ 標準のドキュメント(ここにリンクがまとまっています)や、コンパイラのドキュメント(GCC、Clang)が参考になるでしょう。 C++ と直接関係はありませんが、実際の挙動については CPU のインストラクションや、OS のシステムコールなどについて調べる必要があるかも知れません。
本書に出てくるサンプルコードについて、いくつか注意がありますので、ここにまとめておきます。
- 著者は C 言語でも使える関数 (例えば libc の
printf
,malloc
,free
など) を、 グローバル名前空間にあるものとして使ってしまっています。(例えば::printf()
など。) 私は STL と C 言語でも使える関数を区別したいためにあえてこうしていますが、 C++ の規格では#include <cstdio>
や#include <cstdlib>
などを使って include した場合、 そこで定義されている関数がグローバル名前空間にあることは保証されていないので、 注意しましょう。正式にはstd
名前空間にありますので、std::printf()
などと使います。 - クラス(構造体) の定義をするときに
struct
とclass
の使い分けについてはあまりこだわっていません。 挙動にはいくつか違いがありますので気になる人はご自分で調べてください。 - メンバ変数の名前について、
name_
のように_
(アンダースコア、砕けた言い方としてはアンスコ) が ついているものがあります。これは private member にしたいという気持ちが表われた私のクセです。