読者です 読者をやめる 読者になる 読者になる

auto

C++11では、型名の代わりにautoを使うことで、初期化時に初期値を基準に型推論して型を決定することができる・・・。

で、そのautoの前に、

test.hにclass_testを定義・・・。

x_というメンバを持ち、値をセットしたり、取得したり、出力したりするだけ・・・。

test.cppもこんな感じで、set、get、printの定義・・・。

まずは、iを10で初期化した場合、intを推論される・・・。
一方、sが"ABCDE"というように文字列リテラルで初期化された場合、const char *と推論される・・・。std::stringとかにはならない・・・。

newでclass_testオブジェクトを生成・・・。コンストラクタに100を渡す・・・。
ここで、class_testのポインタを貰うので、pはclass_test *と推論される・・・。
受け取るポインタやオブジェクトのクラス名が長くて書くのがめんどくさい時、autoで済むのは非常に楽である・・・。

今度は、宣言でclass_testオブジェクトoを生成・・・。コンストラクタの引数は200・・・。
poには&o、つまりoのアドレスを渡しているので、poはclass_test *と推論される・・・。

今度はauto側に&が付いていて、oを渡すようにしているので、これは参照を渡していることになる・・・。
roはclass_test &と推論される・・・。

auto側にもoにも&が付いていないので、これはオブジェクトのコピー・・・。
coはclass_testと推論される・・・。

i, sの出力・・・。
それに、p, o, po, ro, coそれぞれのprintメソッドでメンバx_の値を出力・・・。
iは10、sは"ABCDE"・・・。
pは100、oは200、poとroはポインタと参照という違いはあれ、oを指しているので同じ200、coはoのコピーなので同じ200が出力される・・・。

poに300をセットして、o, po, ro, coを再び出力・・・。
o, po, roは同じものを指しているので、300になる・・・。coは別物なので200のまま・・・。

今度はroに400をセットして、再び出力・・・。
o, po, roは400に、coは200のまま・・・。

coを500にセットして、再び出力・・・。
coは500になるが、o, po, roは400のまま・・・。

最後にvectorイテレータでautoを使ってみる・・・。
vec.begin()やvec.end()は、戻り値がstd::vector<int>::iteratorであることが決まっているので、autoで推論できる・・・。
これも長ったらしいので4文字で済むのは嬉しい・・・。

最後にpはnewしたものなのでdelete・・・。

g++はそのままだとC++11モードにならないので、

$ vi auto.cpp
$ g++ -o auto auto.cpp test.cpp -std=c++11
$ ./auto
i = 10
s = ABCDE
x_ = 100
x_ = 200
x_ = 200
x_ = 200
x_ = 200

x_ = 300
x_ = 300
x_ = 300
x_ = 200

x_ = 400
x_ = 400
x_ = 400
x_ = 200

x_ = 400
x_ = 400
x_ = 400
x_ = 500

*itor = 10
*itor = 20
*itor = 30
$

こうする・・・。
autoの推論の例や問題点はいろいろあるけど、まずはこれぐらいで・・・。

Sample/cpp/auto/auto/src/auto at master · bg1bgst333/Sample · GitHub