3. データ型は明示しないで!
- intとかdoubleとかデータ型は明示しないで。
- autoを使った型推論に任せて。
C++はC言語から派生したので、静的に型付けを行うプログラミング言語です。C言語をはじめとする、コンパイラ型と呼ばれるプログラミング言語では、たいていは明示的な型付けを要求します。ここで大事なのは、コンパイル時に型が決まるということで、これはすなわち値の格納に必要なメモリ領域の大きさが、コンパイル時に決まらなければならないということです。
これはC言語でもC++でも同じで、整数型ならint、浮動小数点型ならdouble、ポインタ型ならchar *などと明示するわけです。これは、相手が数値などのプリミティブ型だろうが、構造体のような複合型だろうが、配列であろうが同じです。とにかくサイズがわからなければ話にならん、のです。当たり前の話ですが、コンパイラ型ではコンパイル時にマシンコードを生成するので、値のサイズが分からないとマシンコードも決められない、ということです。
ちなみにコンパイラ型に対比されるインタプリタ型では、特に型を定めずに値を受け入れることで動的な型付けを可能にしていますが、実行速度の面では不利ですし、融通が利く分バグの要因にもなったりします。
リスト5では、整数型、浮動小数点型、ポインタ型の変数を宣言し、sizeof演算子でそれぞれのサイズを出力しています。このように、データ型を明示することで、その大きさも自明に決まるのです。
#include <iostream> using namespace std; int main() { int i; double d; char *p; cout << sizeof(i) << "," << sizeof(d) << "," << sizeof(p) << "\n"; return 0; }
このような、型の明示が必要な理由としては、データ型の指定と初期化が切り離されているから、ということが挙げられます。つまり、データ型以外に値の大きさを決める要素がないことがあるので、これが必須となったという考え方です。また、言語の設計が古く、コンパイラの性能的にも多くを求められなかったということもあり、決め打ちしてもらった方がわかりやすい、ということになったのでしょう。
しかしながら、データ型の指定と初期化が切り離されている書き方は、変数の初期化漏れを招いたり、随所で何度も同じデータ型を記述したりと冗長さを招いたりします。Modern C++では、データ型を明示するよりも、データ型を推論できる書き方が推奨されているようです。これもどこかの回で触れられると思います。