C++函数介绍

函数是一个可重用的语句序列,旨在完成特定的工作。

您已经知道每个可执行程序都必须有一个名为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/

(0)
上一篇 2023年10月2日
下一篇 2023年10月3日

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注