SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Modern C++入門

データ型は明示しないで! Modern C++での型推論

第2回 変数の型はautoで!

  • X ポスト
  • このエントリーをはてなブックマークに追加

ダウンロード sample.zip (2.2 KB)

変数の型推論

 最初のautoは、変数の型推論です。C++11において、変数のauto宣言として使用できるようになりました。

基本データ型の型推論[C++11]

 基本データ型から始めましょう。例えば、こんな感じです。

リスト auto_var.cpp
auto i = 10;			// int型(整数の既定)
auto d = 123.45;		// double型(浮動小数点数の既定)

 型推論を用いた変数宣言の最もシンプルな形でしょう。intやdoubleがautoになっただけです。右辺の初期化子に10や123.45が指定されているので、これは整数型および浮動小数点数型だろうと推論して、int型とdouble型(正確には符号付き32ビット整数型、倍精度浮動小数点数型)として宣言されます。なんでこうなるかというと、これら(intとdouble)を既定で使うのが最も一般的だろうということなんですね。

 同様に、他の型の変数も宣言できます。基本データ型で思いつくものをずらっと並べてみました。

リスト auto_var.cpp
auto u = 10u;		// unsigned int型(Uでも可)
auto l = 20L;		// long型(lでも可)
auto ll = 200LL;	// long long型(llでも可)
auto f = 123.45F;	// float型(fでも可)
auto ld = 123.45L;	// long double型(lでも可)
auto b = true;		// bool型
auto c = 'A';		// char型

 要は、右辺の初期化子に指定するリテラルの表記で、型をコントロールするということです。サフィックスにuかUを付ければ符号なし型、lかLを付ければlong型、浮動小数点数に限ってはfかFを指定することで単精度浮動小数点数型に格下げできます。bool型やchar型に至ってはそのままです(ほかに解釈のしようもありませんね)。

 こうなると、型推論なんて簡単じゃないかと思いますよね。もちろん、宣言済みの変数や式を初期化子に指定すれば、その型から推論される型が選択されます。

リスト auto_var.cpp
auto i_v = i;		// iはintなのでi_vもint型になる
auto i_e = i + 10;	// i + 10はint型に評価されるのでi_eもint型になる

文字列型の型推論[C++14]

 基本データ型は分かった、でもC++のプログラムでは文字列も多用するのだぞ。文字列はどうなるのだ? はい、もちろん文字列リテラルにも型推論は働きます。以下のリストです。

リスト auto_var.cpp
auto sc = "Hello";	// char *型(const char *型)

 このとき、scはchar *型(実装によってはconst char *型)に推論されます。Cを長くやってきた方には自然ですね。ところが、C++にはstd::stringという文字列の取り扱いに特化したクラスがあって、今どきの言語には不可欠で便利な文字列処理の機能を提供してくれます。どのように使うか? ということは各自で調べてほしいのですが、このstd::stringに推論してほしいときは、文字列リテラルにサフィックスsを付加します。ただし、残念なことにこの記法はC++14以降でないと使えません。

リスト auto_var.cpp
auto ss = "Hello"s;	// std::string型(C++14以降)

ポインタ型と参照型の型推論[C++11]

 ポインタ型と参照型も推論できます。上記の文字列リテラルもポインタ型の一つですね。推論は難しくなく、ポインタなら初期化子をポインタにして、参照ではautoの方にアンパサンド「&」を付けるだけです。

リスト auto_var.cpp
auto i_p = &i;		// int *型
auto* i_p2 = &i;	// int *型
auto& i_r = i;		// int&型

 参照の「&」がautoに続いているからといって、auto*でポインタ型になるとは思わないでくださいね。autoに「*」が付いただけではダメで、やはり初期化子はポインタにする必要があるのは変わらないようです。

[NOTE]参照型

 Cにおける間接参照ではポインタが当たり前でした。難解な言語仕様の象徴のように扱われるポインタですが、C++にはより安全に使える間接参照として「参照」があります。CからよっこいしょとC++に上がった方の中には、参照なんて使ったこともない! ポインタの方が便利!(筆者です)という方もいらっしゃるかもしれません。

 参照は、文字通り別の変数への参照です。別名と言ってもいいかもしれません。ポインタが、ポインタ演算子(*)を付けて宣言されるのに対し、参照は参照演算子(&)を付けて宣言します。「&」と言えばアドレス演算子としての使い方を思い出す人も多いでしょうが、参照での「&」は全くの別物です。

int x = 100;	// int型変数xを宣言
int& r = x;	// xへの参照変数を宣言

 参照変数を使って、値の取り出しや書き換えができるのはポインタと変わりませんが、大きな違いがいくつかあります。

  • 参照先が未定義という状態は許されない(ヌルポインタのような扱いはできない)
  • ポインタ演算のように参照先を変更することはできない
  • 値の参照に*演算子は不要
  • 構造体やクラスの参照からメンバへのアクセスはアロー演算子(->)ではなくドット演算子(.)を使う

次のページ
関数戻り値の型推論

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
Modern C++入門連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 山内 直(WINGSプロジェクト ヤマウチ ナオ)

WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS Twitter: @yyamada(公式)、@yyamada/wings(メンバーリスト) Facebook <個人紹介> WINGSプロジェクト所属のテクニカルライター。出版社を経てフリーランスとして独立。ライター、エディター、デベロッパー、講師業に従事。屋号は「たまデジ。」。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/18109 2023/08/17 11:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング