功能

一个函数是的代码单元表示的语句序列。

函数可以接受参数或值并返回单个值(或不返回 )。要使用函数,函数调用将用于参数值,函数调用本身的使用将替换为其返回值。

每个函数都有一个类型签名 - 其参数的类型和返回类型的类型。

函数的灵感来自过程和数学函数的概念。

  • 注意: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++中相对常见但不通用的约定。