名前空間
変種
操作

関数

From cppreference.com
< cpp‎ | language
 
 
C++言語
全般
フロー制御
条件実行文
if
繰り返し文 (ループ)
for
範囲for (C++11)
ジャンプ文
関数
関数宣言
ラムダ式
inline指定子
動的例外仕様 (C++17まで*)
noexcept指定子 (C++11)
例外
名前空間
指定子
const/volatile
decltype (C++11)
auto (C++11)
constexpr (C++11)
consteval (C++20)
constinit (C++20)
記憶域期間指定子
初期化
代替表現
リテラル
ブーリアン - 整数 - 浮動小数点数
文字 - 文字列 - nullptr (C++11)
ユーザー定義 (C++11)
ユーティリティ
属性 (C++11)
typedef宣言
型エイリアス宣言 (C++11)
キャスト
メモリ確保
クラス
クラス固有の関数プロパティ
explicit (C++11)
static

特殊メンバ関数
テンプレート
その他
 
 

関数 (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++は、ラムダ式を使用して無名関数を実装しています。

(C++11以降)

[編集] 関数オブジェクト

関数の左辺値に加えて、関数呼び出し式は、関数へのポインタ、および関数呼び出し演算子をオーバーロードするか関数ポインタに変換可能なクラス型の任意の値 (ラムダ式を含む)(C++11以降)をサポートします。これらの型はまとめてFunctionObjectとして知られており、C++標準ライブラリ全体で広く使用されています。例として、BinaryPredicateCompareの使用法を参照してください。

標準ライブラリはまた、多数の事前定義された関数オブジェクトテンプレートと、新しいものを作成するためのメソッド (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以降)を含む) を提供します。

English 日本語 中文(简体) 中文(繁體)