函数(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 起)相区别的函数声明之间无法重载。
本节未完成原因:链接到其他 Function 子页面 |
函数对象
除了函数左值,函数调用表达式还支持函数指针,被解引用的成员函数指针,lambda 表达式,以及重载了函数调用运算符的任何类类型的对象。这些类型被统称为函数对象 (FunctionObject) ,而且在 C++ 标准库中无所不在地使用它们,示例可见二元谓词 (BinaryPredicate) 和比较 (Compare) 的用法。
标准库亦提供数个预定义函数对象模板,以及一些组成新函数对象的方法(包括 std::mem_fn、std::bind 和 std::function)。