私はC++が初めてです。
私はこのようなクラスを持っています:
class CodeTest
{
private:
static const int TOTAL=100;
};
宣言ですかTOTAL
、それとも定義ですか?
Scott Meyer の本を読んでいたときに、実装ファイルで次のようなものを定義する必要があると書かれていました。
const int CodeTest::TOTAL;
なぜこれが必要なのですか?
私はC++が初めてです。
私はこのようなクラスを持っています:
class CodeTest
{
private:
static const int TOTAL=100;
};
宣言ですかTOTAL
、それとも定義ですか?
Scott Meyer の本を読んでいたときに、実装ファイルで次のようなものを定義する必要があると書かれていました。
const int CodeTest::TOTAL;
なぜこれが必要なのですか?
ヘッダーの外側にある実装ファイルでの宣言が必要です。そうしないと、このヘッダーを含むすべての変換ユニットが独自のオブジェクト(つまり、変数の独自のストレージ)を定義するためです。
これは、単一定義規則に違反します。結果として、たとえば、ある変換ユニットで変数が変更された場合、この変更は他の変換ユニットからは見えなくなります。変数が定数であるため、これはそれほど重要ではありません。ただし、そのアドレスを取得すると、異なる変換単位で異なるポインターが生成されます。
これはいくつかの論争を巻き起こしたので、私は標準を調べました.@Nawazは正しく、私は間違っていました.
9.4.2/2
データ メンバが const 整数型の場合
static
[...]。プログラムで使用され、名前空間スコープ定義に初期化子が含まれていない場合、メンバーは名前空間スコープで定義されます。
あなたが持っているのは宣言であり、変数は値に初期化されています。クラスの外では、変数を定義する必要がありますが、値を割り当てる必要はありません。
const
整数型の部分は、この特定のケースにのみ適用されます。つまり、クラス内で前述の型を初期化できstatic
ますが、すべてのデータ メンバーは外部で定義する必要があります。
定義がクラス外で必要かどうかに関係なく (メンバーを使用するかどうかによって異なります)、クラス内にあるもの (初期化されているかどうかにかかわらず)は単なる宣言です。
質問の最初の部分:
この行:static const int TOTAL=100;
は、宣言とそれに続く初期化です。
TOTAL
は識別子です。
質問の2番目の部分
const int CodeTest::TOTAL
変数を初期化するために必要です。