函数

来自cppreference.com
< cpp‎ | language

函数(function)是把一个语句序列(函数体, function body)关联到一个名字和零或更多函数形参(function parameter)的列表的 C++ 实体。

// 函数名:“isodd”
// 形参列表拥有一个形参,具有名字“n”和类型 int
// 返回类型是 bool
bool isodd(int n)
{                      // 函数体的开始
    return n % 2;
}                      // 函数体的结束

调用函数时,例如在函数调用表达式中,以各个实参(argument)(可为调用场所提供的,或为默认的)来初始化各个形参,然后执行函数体中的语句。

int main()
{
    for(int arg : {-3, -2, -1, 0, 1, 2, 3})
        std::cout << isodd(arg) << ' '; // isodd 被调用 7 次,
                                        // 每次 n 被从 arg 复制初始化
}

函数可通过返回或者抛出异常终止。

函数可以是协程,该情况下它可以暂停执行,以在之后恢复执行。

(C++20 起)

函数声明可出现于任何作用域中,但函数定义只可出现于命名空间作用域,或对于成员友元函数,可在类作用域中出现。声明于类体中而无 friend 说明符的函数是类成员函数。这种函数拥有许多附加性质,细节见成员函数

函数不是对象;不存在函数的数组,而且函数不能按值传递或被其他函数所返回。允许指向函数的指针和到函数的引用,而它们可用于不能使用函数自身之处。

每个函数都具有一个类型,它由函数的返回类型,所有形参的类型(进行数组到指针和函数到指针转换后,见形参列表,函数是否为 noexcept (C++17 起),以及对于成员函数的 cv 限定性和引用限定性所构成。函数类型亦拥有语言连接。不存在 cv 限定的函数类型(不要与如 int f() const; 这样的 cv 限定函数类型,或如 std::string const f(); 这样的返回cv 限定类型的函数相混淆)。

可以用 lambda 表达式产生无名函数。

同一作用域中,多个函数可有相同名称,只要其形参列表,以及对于成员函数的 cv 或引用限定不同即可。这被称作函数重载。仅以返回类型及 noexcept 说明 (C++17 起)相区别的函数声明之间无法重载。

[编辑] 函数对象

除了函数左值,函数调用表达式还支持函数指针,被解引用的成员函数指针,lambda 表达式,以及重载了函数调用运算符的任何类类型的对象。这些类型被统称为函数对象 (FunctionObject) ,而且在 C++ 标准库中无所不在地使用它们,示例可见二元谓词 (BinaryPredicate) 比较 (Compare) 的用法。

标准库亦提供数个预定义函数对象模板,以及一些组成新函数对象的方法(包括 std::mem_fnstd::bindstd::function)。