Namespaces
Variants

Functions

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

関数は、一連の 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++は 匿名関数 を実装するために ラムダ式 を使用します。

(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以降) を含む)。