忍者ブログ
[183] [182] [181] [180] [179] [178] [177] [176] [175] [174] [173]

DATE : 2017/06/29 (Thu)
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。


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 整数データ メンバ以外をクラス内で初期化することはできません』というコンパイルエラーが発生します)。また、宣言と同時に初期化する方法では、静的メンバ関数を使った値の定義はできません。

参考文献

PR
●この記事にコメントする
お名前
タイトル
文字色
メールアドレス
URL
コメント
パスワード
●この記事へのトラックバック
この記事にトラックバックする:
忍者ブログ [PR]
ブログ内検索
最近の状況
リンク
カレンダー
05 2017/06 07
S M T W T F S
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30
使用許諾
最新コメント
(08/15)
(05/04)
(03/06)
(03/04)
(09/25)
最新トラックバック
T/O
(11/05)
ブログ内検索
最近の状況
リンク
カレンダー
05 2017/06 07
S M T W T F S
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30
使用許諾
最新コメント
(08/15)
(05/04)
(03/06)
(03/04)
(09/25)
最新トラックバック
T/O
(11/05)