C++ 関数定義
関数定義は、関数本体 (関数を構成するコード) を指定するという点で関数宣言と異なります。 関数定義の形式は次のとおりです。
decl-specifiers declarator [cv-qualifers] [exception-specification]
{
// function body
}
decl-specifiers declarator [cv-qualifers] =default;
decl-specifiers declarator [cv-qualifers] =delete;
定義の部分は以下のとおりです。
宣言指定子 (「関数の宣言」を参照)。
宣言子 (この記事で後で説明)。
const または volatile 修飾子 (省略可能)。 このコンテキストでは、const は、クラス メンバーにのみ使用することができ、関数がクラスのデータ メンバーを変更しないことを示します。
関数がスローする例外の指定。 「例外の仕様」を参照してください。
中かっこ {} で囲まれたステートメントで構成される関数本体。
=default; は、明示的既定化の定義の場合に使用します。
=delete; は、削除指定の定義の場合に使用します。
宣言子の形式は次のとおりです。
戻り値の型を変更するポインターまたは参照演算子 (省略可能)。
オプションの Microsoft 固有の修飾子。 「Microsoft 固有の修飾子」を参照してください。
関数の名前。 関数がクラスまたは構造体のメンバーである場合、名前はスコープ解決演算子を使用して修飾されている場合があります。
引数の宣言のリストをかっこ () で囲まれた引数宣言リスト。
コンストラクターの場合、コンストラクターの初期化子 (省略可能。この記事で後で説明)。
その場合の宣言子の形式については、関数ポインターを返す関数の「関数の宣言」にあるコメントを参照してください。
引数の宣言の一覧で宣言された仮引数は、関数本体のスコープ内にあります。
次の図では、関数定義の一部を示しています。 網かけされた部分は関数本体です。
関数定義部分
構文のコンストラクター初期化子要素は、コンストラクター内でのみ使用されます。 この目的は、基底クラス、および含まれるオブジェクトの初期化を許可することです。 コンストラクターの初期化子の使用の詳細については、「基本クラスとメンバーの初期化」を参照してください。
明示的に既定化された定義を宣言できるのは、特殊なメンバー関数についてのみです。 特殊なメンバー関数を明示的に既定化すると、実装によってその特殊なメンバー関数が暗黙的な定義と同様に定義されます。ただし、暗黙的に宣言された特殊なメンバー関数は常にインラインですが、明示的に既定にした場合は、インラインでない可能性があります。 既定化関数の詳細については、「C++11 の機能 (Modern C++) のサポート」の「既定化および削除指定関数」を参照してください。
削除指定の定義 (削除指定関数とも呼ばれる) も暗黙的にインラインです。 削除指定関数を、宣言以外の目的で明示的または暗黙的に参照するプログラムは、形式的に適切ではありません。 削除指定関数の詳細については、「C++11 の機能 (Modern C++) のサポート」の「既定化および削除指定関数」を参照してください。