LoginSignup
0
2

More than 5 years have passed since last update.

C++の定数について

Posted at

今、画像処理研究などで、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;
}
0
2
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2