函数是一个可重用的语句序列,旨在完成特定的工作。
您已经知道每个可执行程序都必须有一个名为main的函数(这是程序运行时开始执行的地方)。然而,随着程序开始变得越来越长,将所有代码放在main函数中变得越来越难以管理。函数为我们提供了一种将程序拆分为更易于组织、测试和使用的小型模块化块的方法。大多数程序使用许多函数。C++ 标准库附带了大量已编写的函数供您使用——但是,编写您自己的函数也同样常见。您自己编写的函数称为用户定义函数。
考虑现实生活中可能发生的一个情况:您正在看书,这时您想起需要打电话。您在书中添加了书签,拨打了电话,当您完成电话通话后,您将返回到添加书签的位置,并从上次中断的位置继续阅读书籍。
C++ 程序也可以以同样的方式工作。当程序遇到函数调用时,它将在一个函数内顺序执行语句。函数调用是一个表达式,告诉CPU中断当前函数并执行另一个函数。CPU在当前执行点“打上书签”,然后调用(执行)函数调用中指定的函数。当被调用的函数结束时,CPU 返回到它标记的点,并继续执行。
发起函数调用的函数是调用者,被调用的函数是被调用者或被调用函数。
用户定义函数的示例
首先,让我们从定义用户定义函数的最基本语法开始。在接下来的几课中,所有用户定义的函数都将采用以下形式:
returnType functionName() // This is the function header (tells the compiler about the existence of the function)
{
// This is the function body (tells the compiler what the function does)
}
第一行非正式地称为函数头,它告诉编译器函数的存在、函数的名称以及我们将在以后的课程中介绍的一些其他信息(例如返回类型和参数类型)。
- 在本课中,我们将使用int(对于函数main())或void(其他情况)的returnType 。我们将在下一课中详细讨论返回类型和返回值。
- 就像变量有名称一样,用户定义的函数也有名称。functionName是用户定义函数的名称(标识符)。
- 标识符后面的括号告诉编译器我们正在定义一个函数。
大括号和中间的语句称为函数体。这是确定函数功能的语句所在的位置。
下面是一个示例程序,展示了如何定义和调用新函数:
#include <iostream> // 用于 std::cout
// 用户自定义函数 doPrint() 的定义
void doPrint() // 在这个示例中,doPrint() 是被调用的函数
{
std::cout << "在 doPrint() 函数内\n";
}
// main() 函数的定义
int main()
{
std::cout << "开始 main() 函数\n";
doPrint(); // 通过调用 doPrint() 函数中断 main()。main() 是调用者。
std::cout << "结束 main() 函数\n"; // 这个语句在 doPrint() 结束后执行
return 0;
}
输出:
开始 main() 函数
在 doPrint() 函数内
结束 main() 函数
该程序从main函数的顶部开始执行,并打印要执行的第一行开始main()函数
。
main 中的第二行是对函数 doPrint 的函数调用。 我们通过在函数名称后添加一对括号来调用函数 doPrint,如下所示:doPrint()。 请注意,如果您忘记了括号,您的程序可能无法编译(如果编译了,该函数将不会被调用)。
进行函数调用时,不要忘记在函数名称后面包含括号 ()。
由于进行了函数调用,因此main中的语句执行被挂起,并且执行跳转到被调用函数doPrint的顶部。当doPrint终止时,执行返回到调用者(此处:函数main)并从中断处恢复。
多次调用函数
函数的一个有用之处是它们可以被多次调用。示例:
#include <iostream> // 用于 std::cout
void doPrint()
{
std::cout << "在 doPrint() 函数内\n";
}
// main() 函数的定义
int main()
{
std::cout << "开始 main() 函数\n";
doPrint(); // 第一次调用 doPrint()
doPrint(); // 第二次调用 doPrint()
std::cout << "结束 main() 函数\n";
return 0;
}
由于doPrint被main调用两次,因此 doPrint执行两次。
函数调用链
你已经看到函数 main 可以调用另一个函数(例如上面的例子中的 doPrint 函数)。任何函数都可以调用任何其他函数。在以下程序中,函数 main 调用函数 doA,而函数 doA 又调用函数 doB:
#include <iostream> // for std::cout
void doB()
{
std::cout << "In doB()\n";
}
void doA()
{
std::cout << "Starting doA()\n";
doB();
std::cout << "Ending doA()\n";
}
// Definition of function main()
int main()
{
std::cout << "Starting main()\n";
doA();
std::cout << "Ending main()\n";
return 0;
}
输出:
Starting main()
Starting doA()
In doB()
Ending doA()
Ending main()
不支持嵌套函数
与其他一些编程语言不同,在 C++ 中,函数不能在其他函数内定义。以下程序不合法:
#include <iostream>
int main()
{
void foo() // Illegal: this function is nested inside function main()
{
std::cout << "foo!\n";
}
foo(); // function call to foo()
return 0;
}
编写上述程序的正确方法是:
#include <iostream>
void foo() // no longer inside of main()
{
std::cout << "foo!\n";
}
int main()
{
foo();
return 0;
}
原创文章,作者:jkhxw,如若转载,请注明出处:https://www.jkhxw.com/cpp-functions/