関数
関数 (function) とは、一連の文 (関数本体) を、名前および0個以上の関数仮引数のリストに関連付けるC++のエンティティです。
// function name: "isodd" // parameter list has one parameter, with name "n" and type int // the return type is bool bool isodd(int n) { // the body of the function begins return n % 2; } // the body of the function ends
関数が、例えば関数呼び出し式で呼び出されると、仮引数は実引数 (呼び出し元で指定されるか、デフォルト値が使われる) から初期化され、関数本体の文が実行されます。仮引数リストの末尾が...で終わる場合、関数に追加の実引数を渡すことができます。このような関数を可変引数関数と呼びます。
int main() { for (int arg : {-3, -2, -1, 0, 1, 2, 3}) std::cout << isodd(arg) << ' '; // isodd called 7 times, each // time n is copy-initialized from arg }
関数呼び出し式における非修飾な関数名は、「実引数依存の名前探索 (ADL)」と呼ばれる特別なルール群を用いて探索されます。
関数は、値を返すか、例外をスローすることによって終了できます。
|
関数はコルーチンである可能性があり、その場合、後で再開するために実行を中断することができます。 |
(C++20以降) |
関数宣言は任意のスコープに現れることができますが、関数定義は名前空間スコープ、またはメンバ関数とフレンド関数の場合はクラススコープにのみ現れることができます。friend指定子なしでクラス本体内で宣言された関数は、クラスのメンバ関数です。このような関数は多くの追加のプロパティを持ちます。詳細はメンバ関数を参照してください。
関数はオブジェクトではありません。関数の配列は存在せず、関数を値渡ししたり、他の関数から返したりすることはできません。関数へのポインタと参照 (main関数およびほとんどの標準ライブラリ関数(C++20以降)を除く) は許可されており、関数自身が使用できない場所で使用できます。そのため、これらの関数は「アドレス可能 (addressable)」であると言います。
各関数には型があり、それは関数の戻り値の型、すべての仮引数の型 (配列からポインタへ、関数からポインタへの変換後。 仮引数リストを参照)、関数がnoexceptかどうか(C++17以降)、そして非静的メンバ関数の場合はcv修飾と参照修飾(C++11以降)から構成されます。関数型はリンケージも持ちます。cv修飾された関数型は存在しません (これは、int f() const;のようなcv修飾された関数の型や、std::string const f();のようなcv修飾された型を返す関数と混同しないでください)。関数型のエイリアスにcv修飾子を追加しても、それは無視されます。
同じスコープ内の複数の関数は、仮引数リスト、および非静的メンバ関数の場合はcv/参照(C++11以降)修飾が異なる限り、同じ名前を持つことができます。これは関数オーバーロードとして知られています。戻り値の型とnoexcept指定(C++17以降)のみが異なる関数宣言は、オーバーロードできません。オーバーロードされた関数のアドレスは、異なる方法で決定されます。
| (C++11以降) |
[編集] 関数オブジェクト
関数の左辺値に加えて、関数呼び出し式は、関数へのポインタ、および関数呼び出し演算子をオーバーロードするか関数ポインタに変換可能なクラス型の任意の値 (ラムダ式を含む)(C++11以降)をサポートします。これらの型はまとめてFunctionObjectとして知られており、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以降)を含む) を提供します。