1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

勉強記録 6日目 〜クラスの持つ定数〜 - Effective C++ 第3版 -

Posted at

# はじめに

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と違い、変数の値がコンパイル時に確定しているためなのか、、、

下にクラスのメンバに定数を持つ場合のサンプルコードを示します。

サンプルコード

2_const_static.cpp
#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

1
1
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
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?