今、画像処理研究などで、OpenCVを使ったりする関係で、C++について勉強をしている。
今回、その学習の過程で、C++で定数についての概念が、知らないことだったので、ここにメモをしておく
C++の定数について
C++の定数は、2つの書き方がある。
- const
- constexpr(略:constant expression)
である。この、2つは挙動がはっきりと異なる
const
この記法は、プログラム実行時に 「値を変更しないことを約束します」 という意味である。
よって、コンパイルの時点で不定であってもいい。結局、実行時に変更されなければいいのである。
constexpr
この記法は、「コンパイルされるときに、評価されます」 という意味である。
言葉の通り、コンパイルされた時に、(a.outが作られる)時にすでに決定している。
また、当然ながら、プログラム実行時には変更できない。
例
以上の2つの定数表現についての例を示す
#include <iostream>
#include <vector>
#include <numeric>
using namespace std;
double square(double param){
return param * param;
}
// sumは実引数を変更しない
double sum(const vector<double> &val) {
return accumulate(val.begin(), val.end(), 0.0);
}
int main(void){
const int dmv = 17; // dmvは名前のついた定数
int var = 17; // varは定数では無い
constexpr double max1 = 1.4 * square(dmv); // square(17) が定数であれば、OK
//constexpr double max2 = 1.4 * square(var); // エラー: varは定数ではない
const double max3 = 1.4 * square(var); // OK,実行時に評価されることになる。
vector<double> v{1.2, 3.4, 5.6}; // vは定数ではない
const double s1 = sum(v); // OK,実行時に評価される
//constexpr double s2 = sum(v); // エラー: sum(v)は定数ではない
}
constexprを使用するときのポイント
constexpr を関数で使用する場合、以下のように、出来るだけ簡単なものが良い
constexpr double square(double param){
return param * param;
}