どうもuncleです
今回はC++11で実装されたauto型についての解説をしていきたいと思います。
前回のnullptr同様今回も簡単に使用することが出来ます!
素敵なC++erになるため今回も頑張っていきましょう
ちなみに記憶クラスのautoとは違うので注意してください
それでは続きはこちらからをクリッククリック!
[1回]
まずauto型とは何なのかの説明をさせてもらいます
auto型とはコンパイル時に型を推測して適切な型に置き換えてくれるキーワードです
autoはこのように型名の代わりとして記述します(この場合はint型の代わり)。
バッチリint型に置き換えられていますね
先ほどコンパイル時と書いたんですがVisualStudioではエディタ上で変数名の上にカーソルを合わせることで型を確認することができます
便利だなぁ・・・・。
と言うことでもう少しサンプルを書いてみます
ざっとこんな感じでしょうか?
個人的にはポインタをauto型で受け取る場合には可読性のことも考え、
明示的に「*」を付けたほうが良いかと思います。
ちなみに先ほど話した記憶クラスのautoなんですが、
auto auto Integer = 1; と言うのはコンパイルエラーになります。
auto int Integer2 = 1; これもコンパイルエラーになります。
理由としては
Wikipediaに、こう記述されています
記憶クラス指定子
(auto:C++03まで)
C++03以前では自動変数を意味する記憶クラス指定子であったが、C++11で廃止され、全く別の機能が割り当てられた。
関数内で定義した変数はデフォルトで自動変数となるため、C++03以前においても記憶クラス指定子としてのauto
を用いる必要は全くない。前方互換性のためにも無意味に使用すべきではない。なお、記憶クラスを指定しない変数の記憶クラスのを表す用語としては「自動変数」(auto変数)のままで変更はない。
と言う事で記憶クラス指定子のautoは型推測のautoに置き換わったんですね。
元々autoは省略可能な(と言うより明示的に記述することの方が珍しい)キーワードだったので妥当な結論なのでしょうか
と言うことで前振りはここまでです。
ボチボチと本題に移りましょう
そんなauto型ですが先程のサンプルのようなint型やdouble型で使用するとパッと見た時に何型なのか理解できず可読性が低下します
ではどのような時に使用するといいんでしょうか?
個人的には型をあまり意識しなくても良い場合やスペルミスが発生しやすい型名である場合、タイプ数の多いクラス名などでよく使用します
例えばvectorのイテレータなどです。
こちらも例を交えて解説していきます。
14行目で
std::vector<unsigned int>::iterator 変数名
と記述していますがこの部分を21行目のようにautoで代用する事ができます。
typedef std::vector<unsigned int>::iterator 別名
;
このようにしてタイプ数を減らす方法も一般的ですね
ですがイテレータを取得する為にvectorの数だけtypedefを記述するのは大変ですよね
何より嬉しいのはautoはコンパイル時に置き換えを行うので実行時の処理速度に差が出ないことでしょうか
ちなみに28行目の様な記述も可能です
これはC++11で新しく追加された範囲for文と言うものです
配列でも同様の記述が可能で、とてもスマートな記述が可能です。
詳細については「C++11 範囲for文」と検索してみると参考になるサイトが見つかるかと思います
またstdやboost内にはより長くスペルの難しいクラスが多々存在します。
例えばstd::chrono::time_point<std::chrono::system_clock,std::chrono::system_clock::duration>型なんて物ものもあります
こんなのを記述していたら可読性が下がることは明白ですよね
そんな時にはぜひこのautoを使用してみてはいかがでしょうか
以上!
PR
COMMENT
No Title
auto func()
{
return 0;
}
はエラーにならなかったりします
http://cpplover.blogspot.jp/2014/09/c14.html
No Title
コメントありがとうございました