C++を学ぶにあたって参考にした書籍・Webサイト

#はじめに
この記事は[初心者C++er Advent Calendar 2017](https://qiita.com/advent-calendar/2017/syoshinsya-cpper) の14日目です。

[<< C++の分割コンパイル時に関数のオーバーロード(void test(int)と void test(double)はどうやって区別されているか？](https://qiita.com/qiitamatumoto/items/47a22cbcb8393e869761) || [C++11からC++17を駆け抜けるC++講座](https://qiita.com/yumetodo/items/68f58de43094519ae899)

#C++を書き出した経緯
元々はC言語とDXライブラリでちまちまとノベルゲームを作ったりしていました。
その為、C++で書かれたソースコードを読む機会もなく、「C++って難しいんだろうなぁ」程度の認識でいました。
基本的にはC言語ばっかり書いてましたね(ときたま、Rubyを書いてたりはした)

そんな中、うちのサークル向けに開発した[簡易ノベルゲームエンジン「LINKS」](https://github.com/S-H-GAMELINKS/Novel.Game.Engine.LINKS)をオープンソースソフトウェアとしてリリースしたのが C++ を学び始めたきっかけですね。
より具体的には、そのソースコードを見たyumetodoさんがC++でリファクタリングされたPull Request を投げてこられたことなんですけどねー。

なので、C++ を使いだしたのはここ半年くらい。そのためまだまだ学ぶべき事柄も多く、楽しくC++を書いてます。

で、今回の記事では C++ を学んでいく際に参考になった書籍やWebサイトを紹介していきます。

実際のところ、C++ を学ぶにあたってはかなり性根を入れていかねばなりません。
理由はいろいろありますが、 C++ そのものが持つ機能や仕様が多岐にわたっており、そのため入門者は何から手を付けて良いのかが判断つかないことが理由の一つではないかと個人的に思っています。

事実、C言語でプログラミングをしていたころの私は C++ の複雑さを敬遠していました(まあ、今はそこが病みつきになってしまいましたけど……)

おまけに書籍やWebサイトに書いてあることもそれぞれ異なっていることも多い上に、間違っていることもあります。ですので、間違った情報なのかどうなのかという判別する必要もあり、入門者にはハードルが高いと言えます。

この記事が、これから C++ をはじめたいという入門者への手助けになればと思います。

本稿では、私が C++ を学び始めるにあたって参考にさせていただいたものを一部掲載しております。そのため、他な有用な書籍などが抜けていることもあります。

なお、「この書籍は参考になるぞ！」や「ここの解説は分かりやすいぞ！」などのご意見などありましたら是非コメントなどで教えていただければと思います。

#参考になった書籍

##[やさしいC++](https://www.amazon.co.jp/%E3%82%84%E3%81%95%E3%81%97%E3%81%84C-%E7%AC%AC5%E7%89%88-%E3%80%8C%E3%82%84%E3%81%95%E3%81%97%E3%81%84%E3%80%8D%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E9%AB%98%E6%A9%8B-%E9%BA%BB%E5%A5%88/dp/4797392592/ref=pd_lpo_sbs_14_t_0/356-9185621-2951929?_encoding=UTF8&psc=1&refRID=FYX1XTA0GQ7R7N4PEWZ4)

基本的な C++ の構文などに関してはかなり分かりやすく書かれている。個人的には C++ を学び始める入門書としてはかなり良いのではないかと思う。ただし、色々と書かれていないことも多い(特に、C++11/C++14などで実装された言語機能とか)

そのため、この本を読んで「 C++ を理解した！」などとTwitterでのたまうとマサカリがバンバン飛んでくるので要注意。

かくいう私も、この本に書かれていたオーバーライドの解説を参考にブログの記事を書き、それが誤りであったことをTwitter上で指摘されたこともあり、この本に全幅の信頼はおいていません。

とはいえ、説明自体はかなり分かりやすく演習問題もついていますし。これから入門するという方にはお勧めできる一冊だと言えますね。

ちなみに、実際のオーバーライド云々に関して言及しておくと、

こちらがやさしいC++に書かれていたオーバーライドで(実際にマサカリをいただいた時のコード)

```cpp
class Clang {
  protected:
    string name;
    double ver;
  public:
    Clang();
    void set(string n, double v);
    void show();
    ~Clang();
};

class Cpp : public Clang {
  public:
    Cpp();
    void set(string s, double v);
    void show();
    ~Cpp();
};
```

こちらが正しいオーバーライドですね。

```cpp
class Clang {
  protected:
    string name;
    double ver;
  public:
    Clang();
    virtual void set(string n, double v)
    virtual void show();
    ~Clang();
};

class Cpp : public Clang {
  public:
    Cpp();
    virtual void set(string s, double v) override;
    virtual void show() override;
    ~Cpp();
};
```

やさしいC++で紹介されていたオーバーライドは実際には Hiding と呼ばれるものであり、違うものですね(Hiding に関しては[本の虫のこの記事が参考になります](https://cpplover.blogspot.jp/2010/08/overloadoverridehiding.html))

ちなみに、オーバーライドに関しては[こちらの記事](https://qiita.com/yumetodo/items/f3ceb1a64a1540f85568)が参考になりますよー。
後でコードを読み返すことも考えて、オーバーライドする際には、virtual と override を付けたほうがいいかもしれませんね。



##[Effective C++](https://www.amazon.co.jp/Effective-%E7%AC%AC3%E7%89%88-ADDISON-WESLEY-PROFESSIONAL-COMPUTI/dp/4621066099/ref=sr_1_1?s=books&ie=UTF8&qid=1512129022&sr=1-1&keywords=Effective%E3%80%80C%2B%2B)

やさしいC++を読んだ後に、お優しい御方からいただいたのが Effectivr C++(第二版) でしたね(なお、第三版はまだ購入できていない……)
この本は端的に形容すると「C++ のハウツー本」といったところだろうか？

実際に書かれていることをザックリ抜き出すと以下のような
・#define といったプリプロセッサを使わず、const を使いましょう
・値渡しよりも参照渡しを使おう
・多重継承は慎重に使おう
といった C++ を使う上での注意書きが多い印象。

私が持っているのは第二版なので、C++03 以前に関しての記述になっています。そのため C++11/C++14 に関して学ぶことができなかったのが残念だった……(まあ、後述する Effective Modern C++ でみっちり学べるので良かったんだけどね)

##[C++の設計と進化](https://www.amazon.co.jp/C-%E3%81%AE%E8%A8%AD%E8%A8%88%E3%81%A8%E9%80%B2%E5%8C%96-Bjarne-Stroustrup/dp/4797328541/ref=sr_1_1?s=books&ie=UTF8&qid=1512130097&sr=1-1&keywords=C%2B%2B%E3%81%AE%E8%A8%AD%E8%A8%88%E3%81%A8)

この本も同じ方から頂いて読んだ本。いかにして Bjarne Stroustrup 氏がC++を設計していったかがわかる一冊。
C++ の仕様がどういった歴史的背景から作られていったのかがわかるのが良い点です。

C++ の実際の使い方(コードの書き方)よりも、「どうしてC++が今のようになっていったのか？」というところに重きが置かれて書かれているように思います。

そのため入門者のC++ の学習に直接役立つかと聞かれれば返答に困るところです。ですが、この本を読む前と読んだ後ではC++に対する見方が変わったことは確かです。

あと、C++の生みの親：Bjarne Stroustrup 氏の本音トークが読めるので近場の図書館などにおいてあれば読んでみるべきではないかと思います。


##[Effective Modern C++](https://www.amazon.co.jp/Effective-Modern-%E2%80%95C-11-14%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%82%92%E9%80%B2%E5%8C%96%E3%81%95%E3%81%9B%E3%82%8B42%E9%A0%85%E7%9B%AE/dp/4873117364/ref=sr_1_1?s=books&ie=UTF8&qid=1512130451&sr=1-1&keywords=Effective+Modern+C%2B%2B)

[とある神](https://twitter.com/range_v3)に薦めていただいた本。

C++11/C++14 でのコードの書き方について触れられている良書ですね。
型推論やスマートポインタ、ムーブセマンティクス、ラムダ式など現代的な C++ に関する知識が習得できるのがうれしいところですね。

個人的にうれしかったのが、第3章の「現代のC++への移行」ですねー。
それまで読んでいた本のほとんどがC++03以前に関するものであり、C++11/C++14 について解説されている本を読むのはこれが初めてでした(何もかも近場の図書館のラインナップが良くないことがいけないのだ……)

ちなみに、この本を読みだすまでは Twitter 上で行き交う現代的な C++ の話でよく分からないことも多々あり、Google大先生を使って調べまわってましたね。

解説も分かりやすく、手元にあるC++本では唯一 C++11/C++14 について解説されたものなので重宝させて頂いていますねー。

#参考になったWebサイトなど

##[本の虫](https://cpplover.blogspot.jp/)

言わずと知れた 江添さんのブログ。C++ に関することであれば、とりあえずこのブログを訪れてみるのが良いかもしれない。

C++ 標準化委員会の文書なども解説されており、最新の C++ を学ぶにはうってつけの所といえる。
ただ、その分こちらもそれなりの知識をもってして読まなければならない。そのため、入門者がいきなり本の虫を読み漁るのはモチベーション維持の観点からもオススメできないかも……。

学び始めの段階で、「分からない」「思うようにいかない」ということは非常にストレスだし、なによりモチベーションが維持しづらい。そういう意味で言えば、入門者にいきなり本の虫を薦めるよりは、簡単な入門書を薦める方が良いのかもしれない……。

とはいえ、C++ について知りたいことがあれば訪れておくべきところではある。いったん、書籍などで知識を蓄えたうえで訪れてみるのがよいのではと思うね。

##[cpprefjp - C++日本語リファレンス](https://cpprefjp.github.io/)

C++ の日本語リファレンス。

C++11/C++14/C++17 など各規格で追加された言語機能の解説から、各標準ライブラリのサンプルコードまで幅広く網羅されている。

だいたい何かしら標準ライブラリで分からない事がある時は、ここを訪れて調べまわるのが最近のルーチンワークだね。
大体の場合は、ここの解説を読むと標準ライブラリ関連の疑問は解消されてるね。

一時期、Paizaとかで競技プログラミング問題を解くのにココの解説を参考にさせてもらったなぁ……。


##[C++11の文法と機能(C++11: Syntax and Feature)](http://ezoeryou.github.io/cpp-book/C++11-Syntax-and-Feature.xhtml)

江添さんが公開されている C++11 の規格書。まだ途中までしか読んでいませんが、かなり解説が分かりやすく助かっていますねー。

特に分かりやすかったのが ADL (Argument-dependent name lookup) という名前空間に関するルールの解説ですね。
以前、Twitter上で呟いたC++のコードで 「ADLを当てにするな」というツッコミをいただいたこともあり、ADLについては色々と調べていました。ですが、「なんとなくこういうことなのだろうな」というふわっとした理解でしがこの規格書の ADL の項目を読んで理解が深まりました。

##[Twitter](Twitter.com)
個人的にはもっとも知見が得られるのはTwitterではないかと思う(マサカリを頂きやすいという意味で)
前述したオーバーライド云々もTwitter上に記事をつぶやいたことでツッコミをいただいたしね。

色々な C++er をフォローしておいて、その人たちが呟いた内容を調べるだけでもかなりの知見が得られる。
おまけに、フォローを返されたならラッキーだ。C++ 関連のツイートに対して「正しくはこうですよー」というツッコミ(マサカリともいう)をいただくことができる。

今なら、[Wandbox](https://wandbox.org/)というWeb上でプログラミング言語の動作を確認できるものもあるので、Twitter上でC++を学ぶことも可能ではないかと思う。

あと、個人的にはC++界隈の著名人([江添さん](https://twitter.com/EzoeRyou)、[陶芸家の方](https://twitter.com/bolero_MURAKAMI)など)をフォローしておくとC++関連のニュースもキャッチできるのでかなり良い。

#おわりに
本稿では、これまで私が C++ を学ぶにあたって参考にさせていただいたものを紹介させていただいた。

ここで紹介した書籍やWebサイトなどは有用だと思うが、それだけで C++ の全てを学べるわけではないよ。
実際、書籍の内容を鵜呑みにしたことで有り難いツッコミをいただいたことが何度かあるしね。

一番良い方法は、バンバン新しく学んだ言語機能を使ったコードを書いて、鋭いマサカリを受けることじゃないかと個人的には思う。
実際のところさ、マサカリを受けたおかげで身に染みて理解した C++ の機能とか結構あるし……。