category: C / C++
DATE : 2006/10/10 (Tue)
DATE : 2006/10/10 (Tue)
Java では、次のように定数を書きました。
public Something { public static final int SOME_NUMBER = 10; public static final double SOME_VALUE = 0.1; ... }
C 言語では、主にマクロを使って定義します。
#define SOME_NUMBER 10 #define SOME_VALUE 0.1
C++ でも、マクロを使って定数を宣言できます。しかし、次のように宣言する方法もあります。
const int SOME_NUMBER = 10; const double SOME_VALUE = 0.1; // 宣言されたファイルでのみ使用する場合 static const int SOME_NUMBER = 10; static const double SOME_VALUE = 0.1;
上のコードはクラスの外で定義したものですが、クラス内に宣言することもできます。
class Something { public: static const int SOME_NUMBER; static const double SOME_VALUE; ... }; const int Something::SOME_NUMBER = 10; const double Something::SOME_VALUE = 0.1;
static なメンバ変数(静的メンバ変数)は、インスタンスの数によらず常に1つしかないので、const を付けて定数として扱います。
上のようなクラス内に定義された定数へは、次のような形でアクセスします。
Something::SOME_NUMBER
Something::SOME_VALUE
(;^ω^)Java の場合は、「Something.SOME_NUMBER」「Something.SOME_VALUE」ですね
マクロの代わりにこの方法を用いることで、定数が有効なスコープがはっきりします。
ちなみに、静的メンバ関数を使って定数を初期化することもできます。
class Something { public: static const int SOME_NUMBER; static int getNumber() { ... } }; const int Something::SOME_NUMBER = Something::getNumber();
しかし、これまでの方法では次のような場合に問題が発生します。
class Something { public: static const int SOME_NUMBER; static const double SOME_VALUE; double values[SOME_NUMBER]; ... }; const int Something::SOME_NUMBER = 10; const double Something::SOME_VALUE = 0.1;
つまり、SOME_NUMBER が値の定義(初期化)前に使用されるような場合です。
この問題は、初期化を定数の宣言と同時に行うことで解消できます。
class Something { public: static const int SOME_NUMBER = 10; static const double SOME_VALUE; double values[SOME_NUMBER]; ... }; const double Something::SOME_VALUE = 0.1;
一見すると、double の値も同様に初期化できるように思えます。しかし、定数の宣言と同時に初期化ができるのは、整数値に限られています(少なくとも、Visual C++ 2005 Express Edition では、整数値以外の定数で宣言と同時に初期化しようとすると、『スタティック const 整数データ メンバ以外をクラス内で初期化することはできません』というコンパイルエラーが発生します)。また、宣言と同時に初期化する方法では、静的メンバ関数を使った値の定義はできません。
参考文献
- C++(言語解説) const メンバ 下の方には、古いコンパイラ用のコードが載っています。
PR
●この記事にコメントする
忍者ブログ [PR]