コンピュータプログラミングにおいて、初期化とは、データオブジェクトまたは変数に初期値を割り当てることです。初期化の方法は、プログラミング言語だけでなく、初期化対象オブジェクトの型、記憶クラスなどにも依存します。初期化を実行するプログラミング構成要素は、一般的に初期化子および初期化子リストと呼ばれます。初期化は宣言とは異なり(宣言の後に行われます)、実際には両者が混同されることもあります。初期化の対義語はファイナライゼーションであり、これは主にオブジェクトに対して使用され、変数には使用されません。
初期化は、コンパイル時に値を静的に埋め込むか、実行時に代入することによって行われます。このような初期化を実行するコード部分は一般に「初期化コード」と呼ばれ、ファイルのオープンなど、一度だけ実行される他の関数が含まれる場合があります。オブジェクト指向プログラミングでは、初期化コードはコンストラクタ(クラスメソッド)またはイニシャライザ(インスタンスメソッド)の一部となる場合があります。メモリ位置を16進数のゼロに設定することは、「クリア」とも呼ばれ、追加のメモリアクセスを必要としないため、マシンコードレベルでは、排他的論理和命令(両方のオペランドが同じ変数を指定)によって実行されることがよくあります。
C/C99/C++ では、初期化子は宣言子のオプション部分です。初期化子は、'=' 文字の後に式、または中括弧 (波括弧) で囲まれたカンマ区切りの式のリストで構成されます。後者のリストは、「初期化子リスト」または「初期化リスト」と呼ばれることもあります (ただし、「初期化子リスト」という用語は、C++ ではクラス/構造体メンバーの初期化のために正式に予約されています。下記を参照)。単にその存在を記述するのではなく、データ オブジェクトを作成する宣言は、一般的に定義と呼ばれます。
多くの人は、「宣言」と「定義」という用語を区別するのが便利だと感じており、よく見かける「宣言と定義の区別…」という表現では、宣言は単にデータ オブジェクト (または関数) を指定するものだと解釈されています。実際には、C++ 標準によれば、定義は宣言です。それでも、「宣言と定義」という用法は、形式的には誤りですが、よく使われています。 [ 1 ]すべての定義は宣言ですが、すべての宣言が定義であるとは限りません。
C言語の例:
int i = 0 ; int k [ 4 ] = { 0 , 1 }; char tx [ 3 ] = 'a' ; char ty [ 2 ] = 'f' ; struct Point { int x ; int y ; } p = { . y = 13 , . x = 7 };C++の例:
int i2 = 0 ; int i3 ( 0 ); int i4 { 0 }; int j [ 2 ] = { rand (), k [ 0 ]}; MyClass * xox = new MyClass ( 0 , "zaza" ); Point q {. x = 0 , . y = i + 1 };C++ では、クラス/構造体のコンストラクタは、定義内、コンストラクタ本体の前にメンバ初期化リスト(MIL) を持つことができます。初期化リストを使用すると、値は変数に代入されるのではなく、初期化されます。以下の例では、reとがimコンストラクタパラメータで初期化されます。例:
class GaussianInteger { private : int re ; int im ; public : explicit GaussianInteger ( int re = 0 , int im = 0 ) : re { re }, im { im } {} };ここでいう構成要素とは、re{re}, im{im}初期化子リストのことである。
場合によっては、「初期化子リスト」という用語は、配列または構造体初期化子内の式のリストを指すためにも使用されます。
C++11 では、テンプレートと呼ばれるものによって、より強力な初期化子リストの概念が提供されていますstd::initializer_list<T>。
メンバー初期化リストの初期化中に例外がスローされた場合、コンストラクタ本体内のtry/ブロックではキャッチできません。代わりに、「関数 try ブロック」を使用する必要があります。[ 2 ]catch
import std ;std :: exceptionを使用します。class Foo { private : Bar bar ; public : explicit Foo ( const Bar & b ) try : bar { b } { std :: println ( "Successfully construct Foo" ) ; } catch ( const exception & e ) { std :: println ( "Failed to construct Foo: {}" , e.what ( )); } };プログラム内で明示的な構文を用いなくても、データの初期化が行われる場合があります。例えば、静的変数が初期化子なしで宣言されている場合、プリミティブデータ型の変数は対応する型のゼロで初期化され、クラス型の静的オブジェクトはデフォルトコンストラクタで初期化されます。