名前空間
変種
操作

関数

提供: cppreference.com
< cpp‎ | language
 
 
C++言語
一般的なトピック
フロー制御
条件付き実行文
繰り返し文 (ループ)
ジャンプ文
関数
関数宣言
ラムダ関数宣言
inline 指定子
例外指定 (非推奨)
noexcept 指定子 (C++11)
例外
名前空間
指定子
decltype (C++11)
auto (C++11)
alignas (C++11)
記憶域期間指定子
初期化
代替表現
リテラル
ブーリアン - 整数 - 浮動小数点
文字 - 文字列 - nullptr (C++11)
ユーザ定義 (C++11)
ユーティリティ
属性 (C++11)
typedef 宣言
型エイリアス宣言 (C++11)
キャスト
暗黙の変換 - 明示的な変換
static_cast - dynamic_cast
const_cast - reinterpret_cast
メモリ確保
クラス
クラス固有の関数特性
特別なメンバ関数
テンプレート
その他
 
 

関数はの並び (関数の本体) を名前およびゼロ個以上の関数の仮引数のリストと紐付ける 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
}

関数は、戻ることによって、または例外投げることによって、終了できます。

関数の宣言は任意のスコープ内に現れることができますが、関数の定義は、名前空間スコープ内、または、クラススコープ内 (メンバ関数およびフレンド関数の場合) にのみ、現れることができます。 クラスの本体の中で friend 指定子なしに宣言された関数は、クラスのメンバ関数です。 そのような関数は追加の性質を多く持ちます。 詳細はメンバ関数を参照してください。

関数はオブジェクトではありません。 関数の配列というものはなく、関数を値渡ししたり他の関数から返したりすることはできません。 関数へのポインタや参照は認められており、関数そのものではできないところで使用することができます。

それぞれの関数は型を持ちます。 これは関数の戻り値の型、すべての仮引数の型 (配列からポインタ、関数からポインタへの変換後 (仮引数リストを参照))、関数が noexcept かどうか (C++17およびそれ以降)、 cv 修飾子および ref 修飾子 (メンバ関数の場合) から構成されます。 関数の型には言語リンケージも含まれます。 cv 修飾された関数型というものはありません (int f() const; のような cv 修飾された関数の型や std::string const f(); のような cv 修飾された型を返す関数と混同しないでください)。

ラムダ式によって名前のない関数を生成できます。

仮引数リストおよび cv/ref 修飾 (メンバ関数の場合) が異なる限り、同じスコープ内の複数の関数が同じ名前を持つことができます。 これは関数のオーバーロードと呼ばれます。 戻り値の型および noexcept 指定 (C++17およびそれ以降)のみが異なる関数の宣言はオーバーロードできません。

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

関数の左辺値だけでなく、関数呼び出し式は関数へのポインタ、逆参照されたメンバ関数へのポインタ、ラムダ式、および関数呼び出し演算子をオーバーロードするあらゆるクラス型の変数をサポートします。 これらの型はまとめて関数オブジェクトと呼ばれ、 C++ の標準ライブラリの様々なところで使用されます。 例えば、 BinaryPredicateCompare の用途を参照してください。

標準ライブラリは多くの定義済みの関数オブジェクトのテンプレートや、新しい関数オブジェクトを合成する方法 (std::mem_fn, std::bind, std::function など) も提供しています。