『プログラミング言語 C++ 第4版』(ビャーネ・ストラウストラップ著)第6章の学習メモ。
章末のアドバイスへ、章の内容で補足を記載していく形式でまとめていく。
アドバイス
( "→" 以降は補足説明。)
- 言語仕様の決定事項は、ISO C++標準を参照しよう。
→ ISO:国際標準化機構。ISO C++標準はC++言語の国際規格。 - 指定されない動作と定義されない動作を避けよう。
→標準が指定しない、あるいは、定義しない、とするものを使わないように動力することは、そのための時間と労力に見合うはずだ。 - 処理系定義の動作に依存する必要があるコードは、分離しよう。
→処理系定義の機能は、プログラムを実行するハードウェアの違いと関連するものが多い。
→処理系依存の影響を抑えるため、標準ライブラリ機能を可能な限り利用しておく。 - 文字の値に関する不必要な仮定は避けよう。
→一般的な文字の値は0~127の範囲に収まっているので、その範囲外の文字だけが問題となる。 - 0で始まる数値が8進数であることを忘れないように。
→単なる0は、10進数ではなく8進数。 - マジック定数を避けよう。
- 整数の大きさに関する不必要な仮定は避けよう。
- 浮動小数点型の精度と範囲に関する不必要な仮定は避けよう。
→浮動小数点数リテラルの型は、デフォルトではdoubleとなる。 - signed charとunsigned charよりも、単なるcharを優先しよう。
→ほとんどのアプリケーションでは、論理値にboolを、文字にcharを、整数値にintを、浮動小数点値にdoubleを用いれば済む。これら以外の基本型は、最適化、特殊用途、互換性のためのモノであって、使う必要がなければ、無視してかまわない。
→strcmp()のような標準ライブラリ関数は、単なるcharのみを引数として受け取る。
→全体を通じて単なるcharを利用したうえで、負数にならないようにすれば、問題や混乱を避けられる。 - 符号付型と符号なし型とのあいだの型変換には注意しよう。
→大きな正の数を表現するための1ビットをかせぐためにunsignedを利用する、というのは、よい考えではない。暗黙の返変換規則によって打ち砕かれることが多い。 - 一つの宣言では一つの名前だけを宣言しよう
→宣言演算子(ポインタ(*)や参照(&)など)は、一個の名前のみに作用する。int* p, y;と宣言した場合、int* yとはならない。このような誤解を避けるため。 - 一般的で局所的な名前は短くして、そうでない名前は長くしよう。
→名前を隠すのを最小限にするため。広域変数や大規模関数の局所変数に、iやxなどの名前を用いるのは、トラブルの原因となる。 - 見た目が似ている名前は避けよう。
→"o"の大文字(O)とゼロ(0)、"L"の小文字(l)と"i"の大文字(I)と数字の1など。 - オブジェクトには、型ではなく意味を反映した名前を与えよう。
→char*の名前をpcnameとしたり、intのカウンタをicountとするなどは避ける。名前の型を変更する場合、その名前を利用するすべての箇所を変更しなければならない、プログラムの抽象化レベルを低下させるなどの問題がある。 - 命名規則は、一貫性を維持しよう。
- すべてが大文字となる名前は避けよう。
- スコープは、狭くしよう。
- 内側のスコープと外側のスコープとで同じ名前を利用しないように。
- 型名を用いた宣言には、
{}構文の初期化子を使おう。
→縮小変換を避けることができる。 - autoによる宣言には、
=構文の初期化子を使おう。
→autoの場合、{}はinitializer_listとして導出されてしまうため。 - 未初期化の変数は、使わないように。
- 組み込み型が表現する値が変化する可能性がある場合は、意味ある名前を定義するために別名を使おう。
- 型の同義を定義するために、別名を利用しよう。新しい型を定義するのであれば、列挙体とクラスを利用しよう。
- ポインタは暗黙裡に
boolに変換できる。if(p!=nullptr)よりもif(p)を好んで利用する。
→"pが有効ならば"を直接的に表現できるうえ、記述が短くなる。記述が短いほうが、エラーにつながりにくい。