函数

来自cppreference.com
< cpp‎ | language

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

// 函数名:“ isodd ”
// 参数列表拥有一个参数,有名称“ 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 复制初始化
}

函数可由返回抛出异常终止。

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

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

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

无名函数可由 lambda 表达式生成。

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

[编辑] 函数对象

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

标准库亦提供数个预定义函数对象模板,还有组成新函数对象的方法(含 std::mem_fnstd::bindstd::function )。