Functions
関数は、一連の statements ( function body )を name および0個以上の function parameters のリストと関連付けるC++の実体です。
// 関数名: "isodd" // パラメータリストには1つのパラメータがあり、名前は"n"、型はint // 戻り値の型はbool bool isodd(int n) { // 関数本体の開始 return n % 2; } // 関数本体の終了
関数が呼び出されるとき、例えば 関数呼び出し式 において、仮引数は実引数(呼び出し箇所で提供されるか、 デフォルト引数 が使用される)から初期化され、関数本体の文が実行されます。もし 仮引数リスト が ... で終わる場合、追加の実引数を関数に提供することができ、そのような関数は 可変引数関数 と呼ばれます。
int main() { for (int arg : {-3, -2, -1, 0, 1, 2, 3}) std::cout << isodd(arg) << ' '; // isodd は7回呼び出され、それぞれの // 呼び出しで n は arg からコピー初期化される }
Unqualified 関数名が関数呼び出し式で使用される場合、 "argument-dependent lookup" (ADL) と呼ばれる追加のルールセットを用いて検索が行われます。
関数は、 returning によって、または throwing によって exception を投げることによって終了することができます。
|
関数は coroutine である可能性があり、その場合、実行を中断して後で再開することができます。 |
(since C++20) |
関数宣言は任意のスコープで記述できますが、関数定義は名前空間スコープでのみ、または メンバー関数 および friend 関数の場合はクラススコープでのみ記述できます。friend指定子なしでクラス本体内で宣言された関数はクラスのメンバー関数です。このような関数には多くの追加特性があります。詳細は member functions を参照してください。
関数はオブジェクトではありません:関数の配列は存在せず、関数は値渡しできず、他の関数から返すこともできません。関数へのポインタおよび参照( main関数 および ほとんどの標準ライブラリ関数 (C++20以降) を除く)は許可されており、関数自体が使用できない場面で利用できます。このため、これらの関数は「アドレス可能」であると言います。
各関数には型があり、それは関数の戻り値の型、すべてのパラメータの型(配列からポインタ、関数からポインタへの変換後、
パラメータリスト
を参照)、
関数が
noexcept
かどうか
(C++17以降)
、および非静的メンバ関数の場合、cv修飾
とref修飾
(C++11以降)
から構成されます。関数型はまた
言語リンケージ
を持ちます。cv修飾された関数型は存在しません(
cv修飾関数
の型(例:
int
f
(
)
const
;
)や
cv修飾型
を返す関数(例:
std::
string
const
f
(
)
;
)の型と混同しないでください)。関数型のエイリアスに追加されたcv修飾子は無視されます。
同じスコープ内の複数の関数は、それらのパラメータリストと(非静的メンバー関数の場合)cv /ref (since C++11) 修飾が異なる限り、同じ名前を持つことができます。これは 関数オーバーロード として知られています。戻り値の型 およびnoexcept指定 (since C++17) のみが異なる関数宣言はオーバーロードできません。 オーバーロードされた関数のアドレス は異なる方法で決定されます。
| (C++11以降) |
関数オブジェクト
関数の左辺値に加えて、関数呼び出し式は関数へのポインタ、および関数呼び出し演算子をオーバーロードするか関数ポインタに変換可能な任意のクラス型の値をサポートします ( lambda-expressions を含む) (C++11以降) 。これらを総称して FunctionObject s として知られ、C++標準ライブラリ全体で広く使用されています。例えば、 BinaryPredicate や Compare の使用例を参照してください。
標準ライブラリはまた、多数の事前定義された 関数オブジェクトテンプレート と、新しい関数オブジェクトを構成するための方法も提供しています( std::less 、 std::mem_fn 、 std::bind 、 std::function (C++11以降) 、 std::not_fn (C++17以降) 、 std::bind_front (C++20以降) 、 std::bind_back 、 std::move_only_function (C++23以降) 、 std::copyable_function および std::function_ref (C++26以降) を含む)。