#はじめに
C++でコードを書き始めて、早半年が経ちました。
先日、autoキーワードというものに初めて出会い、勉強したので記事にしてみたいと思います。
#環境
OS: macOS High Sierra ver10.13.6
Xcode: Version 10.1
言語: C++
#autoキーワードについて簡単に説明
autoキーワードはC++ 11以降で使用することができるモノで、変数の型を初期化している値から自動的に推察してくれます。普通に変数を宣言する場合、int i = 1;
のように「この変数名は、int型で扱いますよ!」と明示的にする必要があります。
しかし、auto i = 1;
とすると自動的に判断されiをint型として扱うことが出来ます。([詳しくはここを参照] (https://cpprefjp.github.io/lang/cpp11/auto.html))
#基本動作
さて、もう少し詳しく動作を見ていきましょう。
- 数値を格納した変数のsizeを見てみる
int main(void) {
auto i = 1.2;
int i_size = sizeof(i) / sizeof(double);
std::cout << i << " is byte-size = " << i_size << std::endl;
std::cout << "------" << std::endl;
auto o = 23;
int o_size = sizeof(o) / sizeof(int);
std::cout << o << " is byte-size = " << o_size << std::endl;
return 0;
}
1.2 is byte-size = 1
------
23 is byte-size = 1
autoキーワードの推論で設定した変数ですが、ちゃんと想定した型になっているようですね。
iはint型に、oはdouble型に。
- 文字列を格納した変数のsizeを見てみる
#include <iostream>
#include <stdio.h>
int main(void) {
auto str = "test";
int str_size = sizeof(str) / sizeof(const char*);
std::cout << str << " is byte-size = " << str_size << std::endl;
return 0;
}
test is byte-size = 1
"test"はconst char*に暗黙的に型変換されるようになっているのですが、それもしっかり出来ている。
#どんなタイミングで使えるの?
今まで見て来ていただいた例だといまいち有用性がわかりにくいかと思います。
autoキーワードは、書くのが面倒なイテレーションの代わりを果たしてくれます。
(2018/12/25: 追記)
こちら間違いだったようです。正確には、「イテレーションを記述しなくてはいけない場面でも、推論をしてくれる」です。
#include <vector>
#include <iostream>
#include <iostream>
#include <stdio.h>
using namespace std;
int main ()
{
vector<int> tag;
for( int i = 0; i < 10; ++i ){
tag.push_back( i );
}
vector<int>::iterator start = tag.begin();
std::cout << *start << std::endl;
return 0;
}
上のCodeをautoキーワードを使用すると、、、。
#include <vector>
#include <iostream>
#include <iostream>
#include <stdio.h>
using namespace std;
int main ()
{
vector<int> tag;
for( int i = 0; i < 10; ++i ){
tag.push_back( i );
}
auto start = tag.begin();
std::cout << *start << std::endl;
return 0;
}
このように少しスッキリ書くことができるようになります!
#まとめ
- autoキーワードは、初期化値で推論して変数の型を決定してくれる
- 最大の特徴は、イテレーションでも推論をして適切なモノにしてくれること
記事化出来ないくらいの小ネタは、blogの方で情報発信していこうと思ってます!
[私のBlog] (https://hmon-k.hatenablog.com/)
ぜひ、そちらの方もよろしくお願いします。