理工系研究者のための Mac OS X, Windows, Linux メモ
 
ホーム >> プログラミング >> C++ Tips >> クラスの静的データメンバと定数データメンバ
このエントリーをはてなブックマークに追加

C++:クラスの静的メンバ変数とメンバ定数

更新日:2017.11.29
作成日:2014.1.20
環境:g++ [gcc] 4.8.2
  1. 静的メンバ変数
  2. メンバ定数
  3. クラス定数:静的かつ定数のメンバ変数

静的メンバ変数

ある特定のクラスから生成された複数のオブジェクト同士で共有する変数を静的メンバ変数という。 静的メンバ変数にするにはメンバ変数をstatic指定する。

  1. class Hoge{
  2. public:
  3. static int i;
  4. };
  5.  
  6. int Hoge::i=123; // 初期値の設定

静的メンバ変数は値を書き換えることができる。

Hoge hoge;
hoge.i=456;
また、静的メンバ変数はオブジェクトを作成していなくても利用することができる。
Hoge::i=789;

クラスの定義をヘッダファイルとソースファイルに分け,さらに変数へのアクセスをメンバ関数(setI,getI)を通して行うように変更するには次のように書くと良い。

  1. /* hoge.hh */
  2. class Hoge{
  3. private:
  4. static int i;
  5. public:
  6. static void setI(int val);
  7. static int getI(void);
  8. };
  1. /* hoge.cc */
  2. #include "hoge.hh"
  3.  
  4. int Hoge::i=123;
  5.  
  6. void Hoge::setI(int val){
  7. Hoge::i=val;
  8. }
  9.  
  10. int Hoge::getI(void){
  11. return Hoge::i;
  12. }

メンバ定数

クラスのオブジェクトを作成した時にコンストラクタによって値を決め、それ以降変更できないメンバをメンバ定数という。 オブジェクトごとに異なる値を取ることができる。

メンバ定数を作成するにはメンバ変数をconst指定する。

  1. class Hoge{
  2. public:
  3. const int c;
  4. };
クラス定義の中で、
  1. class Hoge{
  2. public:
  3. const int c=123; /* エラー */;
  4. };
のように初期化することはできない。

初期化するには、コンストラクタの初期化リストを用いる。

  1. class Hoge{
  2. public :
  3. const int c;
  4.  
  5. Hoge();
  6. Hoge(int a);
  7. };
  8.  
  9. Hoge::Hoge() : c(0){
  10. }
  11. Hoge::Hoge(int a) : c(a){
  12. }
ここではコンストラクタ引数なしでオブジェクトが作成された場合c=0となり、引数aが与えられた場合にはc=aのように初期化される。 この値はオブジェクトごとに決まる定数になる。

クラス定数:静的かつ定数のメンバ変数

一つのクラスに対して1つだけ存在し、しかも書き換えができない変数(staticでconstなデータ)は

  1. class Hoge{
  2. public:
  3. static const int sc=123;
  4. }
のように定義する。

クラスに関連した定数を定義するときにはこの方法を用いると良い。

使用するときは、クラスのオブジェクトを作成する必要はなく、静的メンバ変数のように利用できる。
  1. /* main.cpp */
  2. #include <iostream>
  3. #include "hoge.hpp"
  4. int main(){
  5. std::cout << Hoge::sc <<std::endl;
  6. }

初期値の定義をヘッダファイルで行わずソースファイルで行うこともできる。

  1. /* hoge.hpp */
  2. class Hoge{
  3. public:
  4. static const int sc;
  5. }
  1. /* hoge.cpp */
  2. #include "hoge.hpp"
  3. const int Hoge::sc=123;
gcc4.8.5で上記のように初期値の定義をソースファイル側で行ったところ、switch-caseのラベルにその定数を利用した時に cannot appear in a constant-expressionというエラーが出た。初期値の定義はヘッダファイルで行った方がよいと思われる。freemlでも同様な現象が報告されていた。

参考サイト・参考文献

  • 大城正典著『詳説C++ 第2版』, p.164.