# はじめに
Effective C++ 第3版の2項4ページから勉強していきます。
今回は、「クラスの持つ定数」についです。
Effective C++ 第3版 - 2項 #defineより、const, enum, inlineを使おう -
クラスの持つ定数
クラスのメンバ変数に定数を持つ場合
クラスで使う定数のスコープを限定するために、その定数をクラスのメンバ変数とすることがある。
その定数が実際に1つだけ存在するように、static(静的)にしなければならない。
static(静的)なメンバ変数とは?
通常の(非staticな)メンバ変数はクラスのインスタンスを生成する度に確保されるが、
static(静的な)メンバ変数はクラス1つ毎に1つだけと定義される。
そのため、クラスに定数を用いる場合は、
class GamePlayer {
public:
GamePlayer(){};
private:
static const int NumTurns = 5;
int scores[NumTurns];
};
のようになる。
注意:
上のコードであるのは、NumTurnsの宣言であって、定義ではない。
staticな整数型である「クラス定数」だけは、定数の宣言になる。
そのため、
class GamePlayer {
public:
GamePlayer(){};
private:
static const int NumTurns = 5;
int scores[NumTurns];
static const double x = 5;
};
のようなコードの場合、
static const double x = 5;
の部分でコンパイルエラーとなる。
ただし、
class GamePlayer {
public:
GamePlayer(){};
private:
static constexpr int NumTurns = 5;
int scores[NumTurns];
static constexpr double x = 5;
};
のように書くと、コンパイルエラーがでなくなる。
constexprは、constと違い、変数の値がコンパイル時に確定しているためなのか、、、
下にクラスのメンバに定数を持つ場合のサンプルコードを示します。
サンプルコード
#include <iostream>
class GamePlayer {
public:
GamePlayer(){};
private:
static constexpr int NumTurns = 5; // 定数の宣言
int scores[NumTurns]; // 定数の使用
static constexpr double x = 5; // static const だとコンパイルエラー
};
int main(int argc, char* argv[]) {
std::cout << "2_const_static.cpp" << std::endl;
GamePlayer g1;
GamePlayer g2;
}
実行結果
参考文献
・https://www.amazon.co.jp/gp/product/4621066099/ref=dbs_a_def_rwt_hsch_vapi_taft_p1_i0