忍者ブログ

神戸電子専門学校ゲームソフト学科の生徒が運営するGESのブログです。

   

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

autoで可読性の向上を 2年3年向け


どうも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

NAME
TITLE
MAIL(非公開)
URL
EMOJI
Vodafone絵文字 i-mode絵文字 Ezweb絵文字
COMMENT
PASS(コメント編集に必須です)
SECRET
管理人のみ閲覧できます

No Title

  • by NONAME
  • 2015/06/05(Fri)22:48
  • Edit
C++14では
auto func()
{
return 0;
}
はエラーにならなかったりします
http://cpplover.blogspot.jp/2014/09/c14.html

No Title

  • by uncle
  • 2015/06/07(Sun)13:41
  • Edit
確かにC++11の時点で戻り値の型推測が出来なかったのが不思議ですね(厳密にはLambdaでは型推測をしていますが)
コメントありがとうございました

ブログ内検索

最新コメント

[01/29 人面犬]
[10/01 8ch]
[09/12 uncle]
[09/10 某卒業生]
[06/07 uncle]

カレンダー

05 2020/06 07
S M T W T F S
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

テスト

Copyright ©  -- GESブログ --  All Rights Reserved
Design by CriCri / Photo by Geralt / powered by NINJA TOOLS / 忍者ブログ / [PR]