4

静的メンバー変数にデフォルトの引数を使用すると、落とし穴はありますか? このような:

enum Index
{
    INDEX_A = 0,
    INDEX_B
};

class foo
{
public:
    static void method1( int a, int b = INDEX_A);
};

コンパイラは文句を言うことはありませんが、静的に関係する場合は常に注意しています。

4

1 に答える 1

5

技術的には、次を使用します。

static void method1( int a, Index b = INDEX_A);

それ以外は、静的関数は他の関数と何ら変わりはありません。「隠し」thisパラメーターが渡されていないため、関数はクラスのインスタンスで呼び出されません。

また、デフォルトの引数を使用する場合、後でこれを使用して関数を定義すると、本当に楽しいものを得ることができることに注意してください。

static void method1( int a, Index b = INDEX_B)
{
  ...
}

関数を呼び出す場所によっては、 orbの値を持つ可能性があるためです (定義の前に呼び出す場合、または別の翻訳単位で呼び出す場合は 、定義の後に呼び出す場合は、おそらく になります) . 引数は、呼び出しの時点でコンパイラによって埋められます。INDEX_AINDEX_BINDEX_AINDEX_B

静的メンバーに関するコメントは、静的メンバー VARIABLES に適用されます。メンバー関数は、コードがコンパイルおよびリンクされるとすぐに存在します。foo x通常のメンバー変数は、クラスがインスタンス化されるときに作成されます。たとえば、コードがまたはのコードを実行するときfoo *p = new foo;)。静的メンバー変数には「グローバル ストレージ期間」があります。つまり、通常のグローバル変数ではなく、「名前」がクラス内にあるだけで、グローバル変数のようなものです。

はい、翻訳単位間でそれらを使用している場合(異なるソースファイル=異なる翻訳単位)、静的メンバー変数に関しては初期化の順序について心配する必要があります。初期化の順序は、異なる TU 間では (標準で) 定義されていません。

于 2014-05-30T08:25:01.570 に答える