函数
函数(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 限定性和引用限定性 (C++11 起)构成。函数类型亦拥有语言链接。不存在 cv 限定的函数类型(不要与如 int f() const; 这样的 cv 限定函数类型,或如 std::string const f(); 这样的返回 cv 限定类型的函数相混淆)。若添加任何 cv 限定符到函数类型的别名,则它被忽略。
可以用 lambda 表达式产生无名函数。 |
(C++11 起) |
同一作用域中,多个函数可有相同名称,只要其形参列表,以及对于非静态成员函数的 cv 或引用 (C++11 起)限定不同即可。这被称作函数重载。仅以返回类型及 noexcept 说明 (C++17 起)相区别的函数声明之间无法重载。
本节未完成 原因:链接到其他 Function 子页面 |
函数对象
除了函数左值,函数调用表达式还支持函数指针以及重载了函数调用运算符及可转换为函数指针的任何类类型的值(包括 lambda 表达式) (C++11 起)。这些类型被统称为函数对象 (FunctionObject) ,而且在 C++ 标准库中无所不在地使用它们,示例可见二元谓词 (BinaryPredicate) 和比较 (Compare) 的用法。
标准库亦提供数个预定义函数对象模板,以及一些组成新函数对象的方法(包括 std::less、std::mem_fn、std::bind 和 std::function (C++11 起))。