13,009
回編集
(ページの作成:「== 概要 == <br><br> == 実体化の禁止 == C++11以降では、デフォルトコンストラクタとデストラクタに<code>delete</code>キーワードを指定することにより、実体化を禁止することができる。<br> メンバに<code>delete</code>キーワードを指定する場合は、<code>public</code>に記述することがセオリーである。<br> <syntaxhighlight lang="c++"> // C++11以降 class CSampleClass final { p…」) |
(→概要) |
||
1行目: | 1行目: | ||
== 概要 == | == 概要 == | ||
<br><br> | |||
== staticメンバ == | |||
==== staticメンバ変数 ==== | |||
クラスのメンバ変数に<code>static</code>を付加することにより、staticメンバ変数となる。<br> | |||
<br> | |||
staticメンバ変数は、クラスの定義に記述しただけでは定義したことにならないため、実体となる定義をクラス定義と同じスコープに記述する必要がある。<br> | |||
<syntaxhighlight lang="c++"> | |||
class CSampleClass | |||
{ | |||
static 型名 メンバ変数名; // 宣言 | |||
}; | |||
型名 CSampleClass::メンバ変数名; // 定義 | |||
</syntaxhighlight> | |||
<br> | |||
staticメンバ変数は、オブジェクトを生成せずにプログラムの開始時に既に存在しているため、自動的にゼロで初期化される。<br> | |||
ただし、staticメンバ変数の型が、<code>const</code>な整数型、または、<code>const</code>な<code>enum</code>型の場合に限り、宣言と同時に初期化子を与えることができる。<br> | |||
<br> | |||
<syntaxhighlight lang="c++"> | |||
class CSampleClass | |||
{ | |||
private: | |||
enum E { e1, e2 }; | |||
static const int ci = 100; // OK | |||
static const E ce = e1; // OK | |||
static const double cf = 1.0; // コンパイルエラー | |||
static int i = 100; // コンパイルエラー | |||
static E e = e1; // コンパイルエラー | |||
}; | |||
</syntaxhighlight> | |||
<br> | |||
コンパイルエラーになるパターンでは、定義時に初期化子を与える必要がある。<br> | |||
<syntaxhighlight lang="c++"> | |||
class CSampleClass | |||
{ | |||
private: | |||
enum E | |||
{ | |||
e1, | |||
e2 | |||
}; | |||
static const int ci = 100; // OK | |||
static const E ce = e1; // OK | |||
static const double cf; | |||
static int i; | |||
static E e; | |||
}; | |||
const double CSampleClass::cf = 1.0; // OK | |||
int CSampleClass::i = 100; // OK | |||
CSampleClass::E CSampleClass::e = CSampleClass::e1; // OK | |||
</syntaxhighlight> | |||
<br> | |||
<br><br> | |||
== staticオブジェクト == | |||
staticクラスは、自動的にゼロで初期化された後、staticクラスが宣言された箇所が初めて実行される時にコンストラクタが呼び出される。<br> | |||
<br> | |||
staticで宣言したクラスの場合、任意の関数が終了してもデストラクタは呼び出されない。<br> | |||
staticクラスのデストラクタは、ソフトウェア終了直前に呼び出される。<br> | |||
<syntaxhighlight lang="c++"> | |||
void func() | |||
{ | |||
static CSampleClass clsSample; | |||
} | |||
// オブジェクトclsSampleは削除されないため、CSampleClassクラスのデストラクタは呼び出されない | |||
</syntaxhighlight> | |||
<br><br> | <br><br> | ||