1

ヘッダーに静的変数があります。例:

ヘッダー ファイル:

class Fruits{
    public:
        static int colour;
}

ヘッダーを含めた後の cpp ファイルで、次のように記述した方がよいでしょうか。

int Fruits::colour=1;

また

int Fruits::colour(1);

最初は変数の初期化ではなく、別の変数の宣言だと誰かが言った。初期化を設定する正しい方法と場所は何ですか?

4

7 に答える 7

4

C++ が設計されていたとき、以前のコードとの一貫性を保つために、組み込み型type X = y;と同等であると見なされることが決定されました。したがって、指定した静的初期化の2つの例は、コンパイラーによってまったく同じものとして扱われ、同じことを書く方法が異なるだけです。type X(y);

クラスの場合は、より複雑になります。多くの場合、type X = ytype X(y)は互換性がありますが、異なる結果になる場合もあります。これについては、この質問への回答で詳しく説明しています。

于 2013-02-20T15:14:01.180 に答える
3

最初のものはコピー初期化構文を使用することを除いて、それらは同一です(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 つは同等です。

于 2013-02-20T15:13:28.503 に答える
2

これら 2 行のコードは同等であり、どちらも初期化です。

于 2013-02-20T15:11:38.943 に答える
2

のような単純な型の場合int、どちらも同等です。

クラス型の場合、違いがあります。1 つ目は一時オブジェクトからコピーまたは移動初期化しますが、2 つ目は名前付き変数を直接初期化します。実際には、コピーまたは移動は省略され、どちらもまったく同じことを行います。ただし、クラスがコピー可能でも移動可能でもない場合、最初のクラスはコンパイルに失敗します。

したがって、クラス型には 2 番目を使用することをお勧めします。また、一貫性が必要な場合は、すべてのタイプに使用することをお勧めします。

于 2013-02-20T15:13:39.897 に答える
1

「しかし、別の宣言」

はい、異なるヘッダーで複数回定義している場合にのみ、別の宣言です。ただし、宣言されているファイルでのみ定義する場合は同じです。

于 2013-02-20T15:17:42.263 に答える
0

どちらも動作は同等ですが

int Fruits::colour(1);この場合、colourclass別のオブジェクトである場合はコンストラクターを呼び出します(または、同じオブジェクトclassが指定されている場合は、コピーコンストラクターを呼び出します)。

タイプはint基本タイプの1つであるため、これらは同等であり、同等に有効です。

于 2013-02-20T15:15:21.720 に答える
0

最初の解決策ではすべて問題ないようです。これを使用できます。私が見る限り、他の方法は使用されていません。

ここを参照してください。

于 2013-02-20T15:11:49.477 に答える