函数 (I)

使用函数,我们可以以更模块化的方式构建程序,从而在 C++ 中获得结构化编程所能提供的全部潜力。

函数是一组语句,当从程序的某个点调用它时执行。以下是其格式

type name ( parameter1, parameter2, ...) { statements }

,其中
  • 类型是函数返回的数据的数据类型说明符。
  • 名称是允许调用该函数的标识符。
  • parameters (参数)(根据需要):每个参数都包含一个数据类型说明符,后跟一个标识符,就像任何常规变量声明一样(例如int x),并在函数中充当常规局部变量。它们允许在调用函数时将参数传递给函数。不同的参数用逗号分隔。
  • statements (语句)是函数的主体。它是用大括号括起来的语句块{ }.

这是第一个函数示例

// function example
#include <iostream>
using namespace std;

int addition (int a, int b)
{
  int r;
  r=a+b;
  return (r);
}

int main ()
{
  int z;
  z = addition (5,3);
  cout << "The result is " << z;
  return 0;
}
The result is 8

为了检查这段代码,首先要记住在本教程开头所说的一句话:C++ 程序总是从main (主函数)函数开始执行。所以我们将从那里开始。

我们可以看到main (主函数)函数首先声明变量z的类型int (整型)。 之后,我们看到对名为addition (加法)的函数的调用。 注意,我们将能够看到函数调用的结构与上面几行代码中函数本身的声明之间的相似性



参数和自变量有明显的对应关系。在main (主函数)函数中,我们调用addition (加法)传递两个值53,它们对应于为加法函数声明的int aint b参数。

main (主函数)调用函数的时刻起,控制权由main (主函数)失去,并传递给函数addition (加法)。 调用中传递的两个参数的值(53)被复制到函数内的局部变量int aint b。 在函数中。

函数addition (加法)声明另一个局部变量 (int r),并通过表达式r=a+b,它将r赋值为a和 bba和 b的结果。 因为为53传递的实际参数分别是8.

,所以结果是

1
return (r);

以下代码行addition (加法)完成函数main (主函数),并将控制权返回给首先调用它的函数(在本例中为addition (加法))。 此时,程序从被调用中断的同一点开始,继续其正常过程。 但此外,由于函数中的return (返回)addition (加法)语句指定了一个值:变量的内容r (return (r);),该内容在当时的值为8。 此值将变为评估函数调用的值。


因此,由于函数返回的值是在评估时赋予函数调用本身的值,因此变量z将设置为addition (5, 3)返回的值,即8。 要用另一种方式解释它,您可以想象对函数的调用(addition (5,3))实际上被它返回的值(8).

)取代。 main 中的以下代码行是

1
cout << "The result is " << z;

,正如您可能已经预料到的那样,这会在屏幕上产生结果的打印。

变量的作用域


在函数或任何其他内部块中声明的变量的作用域仅限于它们自己的函数或它们自己的块,不能在它们之外使用。例如,在前面的示例中,不可能直接在函数中使用变量a, 和 br,因为它们是函数main (主函数)的局部变量。 此外,也不可能直接在函数中使用变量addition (加法),因为这是函数z的局部变量, 因为这是函数addition (加法)的局部变量。main (主函数).


因此,局部变量的作用域仅限于声明它们的同一块级别。 尽管如此,我们也可以声明全局变量; 这些变量从代码的任何点(包括所有函数内部和外部)都可见。 为了声明全局变量,您只需在任何函数或块之外声明变量; 这意味着直接在程序的主体中。

这是另一个关于函数的示例

// function example
#include <iostream>
using namespace std;

int subtraction (int a, int b)
{
  int r;
  r=a-b;
  return (r);
}

int main ()
{
  int x=5, y=3, z;
  z = subtraction (7,2);
  cout << "The first result is " << z << '\n';
  cout << "The second result is " << subtraction (7,2) << '\n';
  cout << "The third result is " << subtraction (x,y) << '\n';
  z= 4 + subtraction (x,y);
  cout << "The fourth result is " << z << '\n';
  return 0;
}
The first result is 5
The second result is 5
The third result is 2
The fourth result is 6

在这种情况下,我们创建了一个名为subtraction (减法)的函数。 此函数唯一做的就是减去两个传递的参数并返回结果。

尽管如此,如果我们检查函数main (主函数),我们将看到我们对函数subtraction (减法)进行了多次调用。 我们使用了一些不同的调用方法,以便您了解函数可以被调用的其他方式或时刻。

为了完全理解这些示例,您必须再次考虑对函数的调用可以被函数调用本身将要返回的值所替换。 例如,第一种情况(您应该已经知道了,因为它与我们在以前的示例中使用过的模式相同)

1
2
z = subtraction (7,2);
cout << "The first result is " << z;

如果我们用它返回的值(即,5)替换函数调用,我们将得到

1
2
z = 5;
cout << "The first result is " << z;

, 以及

1
cout << "The second result is " << subtraction (7,2);

与之前的调用具有相同的结果,但在这种情况下,我们直接将对subtraction (减法)的调用作为插入参数传递给、cout。 只需考虑结果与我们编写

1
cout << "The second result is " << 5;

相同,因为5是由subtraction (7,2).

返回的值。

1
cout << "The third result is " << subtraction (x,y);

subtraction (减法)的情况下, 我们唯一引入的新内容是subtraction (减法)的参数是变量而不是常量。 这完全有效。 在这种情况下,传递给函数的值是的值,分别是y53,得到2作为结果。

第四种情况大同小异。 只需注意,我们可以编写

1
z = 4 + subtraction (x,y);

而不是

1
z = subtraction (x,y) + 4;

,结果完全相同。 我交换了位置,以便您可以看到分号 (;) 位于整个语句的末尾。 它不一定必须紧跟在函数调用之后。 解释可能再次是,您想象一个函数可以被其返回值替换

1
2
z = 4 + 2;
z = 2 + 4;

没有类型的函数。void 的用法。


如果你记得函数声明的语法

type name ( argument1, argument2 ...) statement

您将看到声明以类型开头,这是函数本身的类型(即,函数将通过返回语句返回的数据的类型)。 但是如果我们不想返回值呢?

假设我们只想创建一个函数在屏幕上显示一条消息。 我们不需要它返回任何值。 在这种情况下,我们应该使用函数的void (空)类型说明符。 这是一个特殊的说明符,指示缺少类型。

// void function example
#include <iostream>
using namespace std;

void printmessage ()
{
  cout << "I'm a function!";
}

int main ()
{
  printmessage ();
  return 0;
}
I'm a function!

void (空)也可以在函数的参数列表中使用,以显式指定我们希望该函数在调用时不接受任何实际参数。 例如,函数printmessage (打印信息)可以声明为

1
2
3
4
void printmessage (void)
{
  cout << "I'm a function!";
}

虽然在参数列表中指定void (空)是可选的。 在 C++ 中,如果我们想要一个没有参数的函数,则可以简单地将参数列表留空。

您必须始终记住的是,调用函数的格式包括指定其名称并将参数括在括号中。 参数的不存在并不能免除我们编写括号的义务。 因此,对printmessage (打印信息)的 C++ 等效文件是

1
printmessage ();

的调用必须始终使用括号。括号清楚地表明这是一个对函数的调用,而不是变量或其他 C++ 语句的名称。 以下调用将是不正确的。

1
printmessage;
Index
目录