c++を書く上でとても便利な auto
の使い方を入門者レベルで紹介します。
サンプルコードもあるので、是非参考にしてください。
目次
簡単な説明
変数宣言のとき、型を記述するところがありますよね?
int x = 1; double y = 2.0;
上の例だと、int
と double
が型を記述するところです。
このように型を明示的に記述せずに、auto
と記述すると、コンパイル時に自動で変数の型を決定します。
auto x = 1; auto y = 2.0;
上記の場合、auto
は初期化子(=の右辺)から型を推論しています。
サンプルコード
次に、サンプルコードを見ながら、auto
が おうっと 驚くほどに便利であることを解説していきます。
#include <iostream> #include <vector> class Memo { int val; public: Memo( int a ) { val = a; } auto getVal() { return val; } // auto: 返り値の型を推論 -> int }; int main( int argc, char** argv){ auto x = 1; // auto: xの型を推論 -> int auto p = &x; // auto: yの型を推論 -> int* *p = 2; std::vector<int> vec( 3 ); // サイズ3のベクトルを生成 // auto: イテレータの型名をautoで推論 -> std::vector<int>::iterator for ( auto it = vec.begin(); it != vec.end(); ++it ) *it = x++; // auto: コンテナの要素を推論 -> int& for ( auto& v : vec ) { Memo m( v*v ); // 2乗してメモ std::cout << m.getVal() << std::endl; // メモした値を出力 } return 0; }
auto
を使っているのを上から見ていきます。
関数の返り値による型推論
auto getVal() { return val; } // auto: 返り値の型を推論 -> int
ここでは、auto
は関数の返り値を推論します。
これだけではありがたみを感じにくいですが、例えば開発段階で変数 val
の型を変更したとき、修正箇所が1箇所で済むのが利点の一つです。
初期化子による型推論
auto x = 1; // auto: xの型を推論 -> int auto p = &x; // auto: yの型を推論 -> int*
これは上で説明した通り、初期化子(=の右辺)から x
と p
の型を推論しています。
イテレータの型名を auto
で推論
for ( auto it = vec.begin(); it != vec.end(); ++it ) *it = x++;
これは開発をする上で非常に嬉しいですよね。もし、明示的に型を宣言するなら、
for ( std::vector<int>::iterator it = vec.begin(); it != vec.end(); ++it ) *it = x++;
このようになりめんどうです。auto
を活用することで、
- タイプ数が減る
- 可読性も上がる(デバックしやすくなる)
といったメリットがあるのが実感できると思います。
範囲for文でのコンテナの要素を推論
for ( auto& v : vec )
もし、auto
を使わないなら、
for ( int& v : vec )
こうなります。
ここもあまりありがたみを感じにくいですが、「関数の返り値による型推論」と同様に、vec
の型を変更したときに、修正箇所が1箇所で済むのが利点の一つです。
以上となります、皆さん auto
をどんどん使ってみてください。
すぐに使えて、得した気分になれますよ!