静的メンバー変数にデフォルトの引数を使用すると、落とし穴はありますか? このような:
enum Index
{
INDEX_A = 0,
INDEX_B
};
class foo
{
public:
static void method1( int a, int b = INDEX_A);
};
コンパイラは文句を言うことはありませんが、静的に関係する場合は常に注意しています。
静的メンバー変数にデフォルトの引数を使用すると、落とし穴はありますか? このような:
enum Index
{
INDEX_A = 0,
INDEX_B
};
class foo
{
public:
static void method1( int a, int b = INDEX_A);
};
コンパイラは文句を言うことはありませんが、静的に関係する場合は常に注意しています。
技術的には、次を使用します。
static void method1( int a, Index b = INDEX_A);
それ以外は、静的関数は他の関数と何ら変わりはありません。「隠し」this
パラメーターが渡されていないため、関数はクラスのインスタンスで呼び出されません。
また、デフォルトの引数を使用する場合、後でこれを使用して関数を定義すると、本当に楽しいものを得ることができることに注意してください。
static void method1( int a, Index b = INDEX_B)
{
...
}
関数を呼び出す場所によっては、 orb
の値を持つ可能性があるためです (定義の前に呼び出す場合、または別の翻訳単位で呼び出す場合は 、定義の後に呼び出す場合は、おそらく になります) . 引数は、呼び出しの時点でコンパイラによって埋められます。INDEX_A
INDEX_B
INDEX_A
INDEX_B
静的メンバーに関するコメントは、静的メンバー VARIABLES に適用されます。メンバー関数は、コードがコンパイルおよびリンクされるとすぐに存在します。foo x
通常のメンバー変数は、クラスがインスタンス化されるときに作成されます。たとえば、コードがまたはのコードを実行するときfoo *p = new foo;
)。静的メンバー変数には「グローバル ストレージ期間」があります。つまり、通常のグローバル変数ではなく、「名前」がクラス内にあるだけで、グローバル変数のようなものです。
はい、翻訳単位間でそれらを使用している場合(異なるソースファイル=異なる翻訳単位)、静的メンバー変数に関しては初期化の順序について心配する必要があります。初期化の順序は、異なる TU 間では (標準で) 定義されていません。