C++の豆知識
ひさしぶりにC++を使ってみたら、いろいろな機能が増えていました。 Geant4のサンプルコードを読むときに知っておくとよさそうだと思ったことを整理しておきます。
スタイリングガイド
C++の変遷
C++ |
リリース年 |
ISO |
---|---|---|
C++98 |
1998 |
ISO/IEC 14882:1998 |
C++03 |
2003 |
ISO/IEC 14882:2003 |
C++11 |
2011 |
ISO/IEC 14882:2011 |
C++14 |
2014 |
ISO/IEC 14882:2014 |
C++17 |
2017 |
ISO/IEC 14882:2017 |
C++20 |
2020 |
ISO/IEC 14882:2020 |
C++23(予定) |
2023 |
ISO/IEC 14882:2023 |
C++11以降を「モダンC++」と呼ぶそうです。
C++11で、ラムダ式やauto
キーワードなど、大幅に機能が追加されました。
以前使っていたのはC++98/C++03だと思うので、どうりで機能が増えているはずです。
Geant4(v4.11.2)はC++17に対応しています。 Geant4のバージョンが対応しているC++などの情報は Geant4のバージョンに整理しました。
STL(Standard Template Library)
1#include <vector> // std::vector
2#include <map> // std::map
3#include <tuple> // std::tuple
4// などなど
STLはC++98から標準ライブラリとして採用されているそうです。 大学院生のころ(2010年ころ)は、使い方がよく分からず避けてきましたが、いまなら使えそうな気がします。
一様初期化
1// 変数の初期化
2int x = 100;
3double y(3.14);
4char z = "z";
5
6// 変数の一様初期化
7int x{100};
8double y{3.14};
9char z{"z"};
C++11からインスタンスの初期化に{}
(中括弧/波括弧)が使えるようになっていました。
1// 配列の初期化
2int array[] = {1, 2, 3, 4, 5};
3
4// 配列の一様初期化
5int array[]{1, 2, 3, 4, 5};
・・・なんで括弧の使い方を増やしてしまったんだと思いましたが、変数、配列・コンテナー、構造体、クラスなどを同じ書式で初期化できるのがメリットのようです。
1// コンテナーの初期化
2std::vector<int> vec;
3vec.push_back(1);
4vec.push_back(2);
5vec.push_back(3);
6
7// コンテナーの一様初期化
8std::vector<int> vec{1, 2, 3};
とくにstd::vector
の初期化が簡単に書けるようになっています。
また、型安全性も向上していて、モダンC++での使用が推奨されている初期化スタイルだそうです。
autoキーワード
1// 型を指定
2G4NistManager *nm = new G4NistManager::Instance();
3
4// 型を推論
5auto nm = G4NistManager::Instance();
auto
は型推論で変数の型を指定するためのキーワードです。
使いたい型が分かりきっている場合や、返り値の型名が長い場合に使うと可読性が向上します。
Geant4はクラス名が長いものが多いため、どんどん使ってよいと思います。
ただし、すべてauto
になってしまうと、逆に読みづらくなることもあるため、自分(やチーム)の中でルールを決めて使うのがよさそうです。
C++の参考サイト
ISO C++: C++の公式サイト
C++ Reference: C++標準ライブラリのリファレンス
Learn C++: C++学習サイト。ハンズオンではなく読みもの
Modern C++ Features: モダンC++の各機能の簡易まとめ