功能
一个函数是的代码单元表示的语句序列。
函数可以接受参数或值并返回单个值(或不返回 )。要使用函数,函数调用将用于参数值,函数调用本身的使用将替换为其返回值。
每个函数都有一个类型签名 - 其参数的类型和返回类型的类型。
函数的灵感来自过程和数学函数的概念。
- 注意:C++函数本质上是过程,不遵循数学函数的确切定义或规则。
功能通常用于执行特定任务。并且可以从程序的其他部分调用。必须先声明和定义函数,然后才能在程序中的其他位置调用它。
- 注意:流行的函数定义可能隐藏在其他包含的文件中(通常为了方便和在许多文件中重用)。这是头文件的常见用法。
功能声明
一个函数声明中声明其名称和类型签名的编译器功能的存在。语法如下:
int add2(int i); // The function is of the type (int) -> (int)
在上面的示例中,int add2(int i)
函数向编译器声明以下内容:
- 在返回类型为
int
。 - 该函数的名称是
add2
。 - 数量的参数的函数为 1:
- 第一个参数是
int
类型。 - 第一个参数将在函数的内容中以名称
i
引用。
- 第一个参数是
参数名称是可选的; 该功能的声明也可以如下:
int add2(int); // Omitting the function arguments' name is also permitted.
根据单定义规则,具有特定类型签名的函数只能在 C++编译器可见的整个 C++代码库中声明或定义一次。换句话说,具有特定类型签名的函数无法重新定义 - 它们只能定义一次。因此,以下是无效的 C++:
int add2(int i); // The compiler will note that add2 is a function (int) -> int
int add2(int j); // As add2 already has a definition of (int) -> int, the compiler
// will regard this as an error.
如果函数不返回任何内容,则其返回类型将写为 void
。如果不带参数,则参数列表应为空。
void do_something(); // The function takes no parameters, and does not return anything.
// Note that it can still affect variables it has access to.
功能调用
声明后可以调用一个函数。例如,以下程序在 main
的函数中调用 add2
,其值为 2
:
#include <iostream>
int add2(int i); // Declaration of add2
// Note: add2 is still missing a DEFINITION.
// Even though it doesn't appear directly in code,
// add2's definition may be LINKED in from another object file.
int main()
{
std::cout << add2(2) << "\n"; // add2(2) will be evaluated at this point,
// and the result is printed.
return 0;
}
这里,add2(2)
是函数调用的语法。
功能定义
一个函数定义 *类似声明,但它也包含在函数被它的身体内调用时执行的代码。
add2
的函数定义示例可能是:
int add2(int i) // Data that is passed into (int i) will be referred to by the name i
{ // while in the function's curly brackets or "scope."
int j = i + 2; // Definition of a variable j as the value of i+2.
return j; // Returning or, in essence, substitution of j for a function call to
// add2.
}
功能重载
你可以创建具有相同名称但不同参数的多个函数。
int add2(int i) // Code contained in this definition will be evaluated
{ // when add2() is called with one parameter.
int j = i + 2;
return j;
}
int add2(int i, int j) // However, when add2() is called with two parameters, the
{ // code from the initial declaration will be overloaded,
int k = i + j + 2 ; // and the code in this declaration will be evaluated
return k; // instead.
}
这两个函数都使用相同的名称 add2
调用,但调用的实际函数直接取决于调用中参数的数量和类型。在大多数情况下,C++编译器可以计算要调用的函数。在某些情况下,必须明确说明类型。
默认参数
函数参数的默认值只能在函数声明中指定。
int multiply(int a, int b = 7); // b has default value of 7.
int multiply(int a, int b)
{
return a * b; // If multiply() is called with one parameter, the
} // value will be multiplied by the default, 7.
在此示例中,可以使用一个或两个参数调用 multiply()
。如果只给出一个参数,则 b
的默认值为 7.默认参数必须放在函数的后面参数中。例如:
int multiply(int a = 10, int b = 20); // This is legal
int multiply(int a = 10, int b); // This is illegal since int a is in the former
特殊功能调用 - 运算符
在 C++中存在特殊的函数调用,它们的语法与 name_of_function(value1, value2, value3)
不同。最常见的例子是运算符。
某些特殊字符序列将被编译器缩减为函数调用,例如 !
,+
,-
,*
,%
和 <<
等等。这些特殊字符通常与非编程用法相关联或用于美学(例如,+
字符通常被认为是 C++编程和初等数学中的加法符号)。
C++使用特殊语法处理这些字符序列; 但实际上,每次出现的运算符都会缩减为函数调用。例如,以下 C++表达式:
3+3
相当于以下函数调用:
operator+(3, 3)
所有运算符函数名称都以 operator
开头。
虽然在 C++的前一个 C 中,通过提供具有不同类型签名的附加定义,操作符函数名称不能被赋予不同的含义,在 C++中,这是有效的。在一个唯一的函数名称下隐藏其他函数定义在 C++中称为运算符重载,并且是 C++中相对常见但不通用的约定。