ヘッダーに静的変数があります。例:
ヘッダー ファイル:
class Fruits{
public:
static int colour;
}
ヘッダーを含めた後の cpp ファイルで、次のように記述した方がよいでしょうか。
int Fruits::colour=1;
また
int Fruits::colour(1);
最初は変数の初期化ではなく、別の変数の宣言だと誰かが言った。初期化を設定する正しい方法と場所は何ですか?
ヘッダーに静的変数があります。例:
ヘッダー ファイル:
class Fruits{
public:
static int colour;
}
ヘッダーを含めた後の cpp ファイルで、次のように記述した方がよいでしょうか。
int Fruits::colour=1;
また
int Fruits::colour(1);
最初は変数の初期化ではなく、別の変数の宣言だと誰かが言った。初期化を設定する正しい方法と場所は何ですか?
C++ が設計されていたとき、以前のコードとの一貫性を保つために、組み込み型type X = y;
と同等であると見なされることが決定されました。したがって、指定した静的初期化の2つの例は、コンパイラーによってまったく同じものとして扱われ、同じことを書く方法が異なるだけです。type X(y);
クラスの場合は、より複雑になります。多くの場合、type X = y
とtype X(y)
は互換性がありますが、異なる結果になる場合もあります。これについては、この質問への回答で詳しく説明しています。
最初のものはコピー初期化構文を使用することを除いて、それらは同一です(C++11 標準の段落 8.5/14 を参照)。
T a = b;
2 つ目は直接初期化構文を使用します (C++11 標準の 8.5/15 項を参照)。
T a(b); // C++11 also supports T a{b};
非クラス型の場合、この 2 つは同等です。
これら 2 行のコードは同等であり、どちらも初期化です。
のような単純な型の場合int
、どちらも同等です。
クラス型の場合、違いがあります。1 つ目は一時オブジェクトからコピーまたは移動初期化しますが、2 つ目は名前付き変数を直接初期化します。実際には、コピーまたは移動は省略され、どちらもまったく同じことを行います。ただし、クラスがコピー可能でも移動可能でもない場合、最初のクラスはコンパイルに失敗します。
したがって、クラス型には 2 番目を使用することをお勧めします。また、一貫性が必要な場合は、すべてのタイプに使用することをお勧めします。
「しかし、別の宣言」
はい、異なるヘッダーで複数回定義している場合にのみ、別の宣言です。ただし、宣言されているファイルでのみ定義する場合は同じです。
どちらも動作は同等ですが
int Fruits::colour(1);
この場合、colour
がclass
別のオブジェクトである場合はコンストラクターを呼び出します(または、同じオブジェクトclass
が指定されている場合は、コピーコンストラクターを呼び出します)。
タイプはint
基本タイプの1つであるため、これらは同等であり、同等に有効です。
最初の解決策ではすべて問題ないようです。これを使用できます。私が見る限り、他の方法は使用されていません。
ここを参照してください。