こんにちは。tomcppfairyです。
今回は、日本語C++入門書に対する不満を挙げてみました。
私自身もC++初心者な部分があるため、間違っている部分が有ればぜひおしえてください
日本語C++入門書の不満な点
- ほとんど使わない機能を無駄に説明している
「プログラミングをできるだけ簡単にしたい」or「早くしたい」という人ならこれでいいかもしれませんが、それ以外では入門書の内容をそのまま受け止めるのはやめたほうがいいかと思います。
では、不満の詳細を述べていきます。
不満その一・ほとんど使わない機能を無駄に説明している
なぜ、ほとんどつかわない機能に大きく説明を割くのか、理解不能です。
まず、すぐに挙げられるのは下記のとおりです。
- Cスタイルの配列
- 生のポインタ
- new delete
- 生の列挙体
- typedef
一つずつ説明していきます。
Cスタイルの配列
なぜこれを使うのか理解不能です。関数において、Cスタイルの配列を引数として渡した場合、先頭要素を指すポインタ型にキャストされます。つまり、要素数を別に指定する必要があり、めんどくさいです。また、固定長配列のため、使いにくいです。どうしても固定長配列を使いたいなら、std::array
を使いましょう。そうでなければstd::vector
などを使うといいと思います。
生のポインタ
理解できないことはありませんが、あまり使用したくないです。昨今のC++にはスマートポインタというものがあり、これを使用すればメモリのもろもろの問題を比較的気にせずともいいようになります。生のポインタは時代遅れです。
new delete
newすれば必ずdeleteしなければならない。それを解決するためのものがスマートポインタです。new deleteも時代遅れです。
生の列挙体
列挙体自体は問題ありません。しかし、enum {}
では不都合です。デフォルトでは、メンバには単純な数字が与えられるため、バグが生じる可能性が高いからです。enum class {}
を使いましょう。これなら安心です。
typedef
usingがあるのに、なんでtypedefを使うのでしょうか? usingは関数ポインタなどを書く際非常にtypedefと比べて可読性が高くなります。また、テンプレートが使えます。typedefはテンプレート使えません。どう考えてもusingのほうが優秀ですね。
template <typename T>
typedef std::vector<T> vec; //error!
template <typename T>
using vec = std::vector<T>; //OK!
不満その二・C++の理念を無視している
-
using namespace std;
を推奨している -
bits/stdc++.h
をincludeすることを推奨している(場合による)
using namespace stdを推奨している
言うまでもなく、論外ですね。名前汚染もいいとこです。せっかく標準でstd名前空間にふくんでいるのに、それを取り外す意味がありません。Pythonのfrom modulename import *
くらいひどいです。
まず、可読性が低くなります。標準ライブラリの名前はシンプルなものが多いため、stdを外すと、標準ライブラリ関数なのか、自作関数なのかぱっと見でわかりません。std::printなどはいい例でしょう。
次に、先程も言ったように名前汚染がひどいです。標準ライブラリの名前はシンプルなものが多いため、長いプログラムを書くと、どこかで名前に引っかかります。それを解決するのがstdです。stdを省略するとその利点が失われます。
bits/stdc++.hを推奨している
bits/stdc++.hは、プログラムがちょっと短くなる以外の利点がないです。
これについて少し調べたのですが、そもそも使い方を間違えているという記事を見つけました。これは私も知らなかったので掲載していきます。
https://qiita.com/hakatashi/items/f9d9abf05a002b5c4dc5
結論
どうだったでしょうか? 間違ったところが有ればおしえてくれたら助かります。