函数
函数是把一个语句序列(函数体)关联到名称和零或更多函数参数列表的 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 起)区别的函数声明无法被重载。
本节未完成 原因:链接到其他 Function 子页面 |
[编辑] 函数对象
除了函数左值,函数调用表达式还支持指向函数的指针、指向成员函数的解引用的指针、 lambda 表达式,及任何重载函数调用运算符的类类型对象。这些类型被一同称作函数对象 (FunctionObject
) ,而且他们在 C++ 标准库中被无所不在地使用,示例见二元谓词 (BinaryPredicate
) 和比较 (Compare
) 的用法。
标准库亦提供数个预定义函数对象模板,还有组成新函数对象的方法(含 std::mem_fn 、 std::bind 及 std::function )。