C++ 入门(三)— 函数

文章目录

  • 函数简介
  • 函数返回值
  • Void 函数(非值返回函数)
  • 函数参数和参数
  • 局部范围
  • 函数的声明和定义
  • 具有多个代码文件的程序

函数简介

C++ 程序的方式工作。当程序遇到函数调用时,它将在一个函数内按顺序执行语句。函数调用是告诉 CPU 中断当前函数并执行另一个函数的表达式。CPU 在当前执行点“放置一个标记”,然后调用(执行)函数调用中指定的函数。当调用的函数结束时,CPU 将返回到它添加标记的点,并继续执行。

下面是一个示例程序,演示如何定义和调用新函数:

#include 

void doPrint() // 函数定义
{
    std::cout << "In doPrint()" << std::endl;
}

int main()
{
    std::cout << "Starting main()" << std::endl;
    doPrint(); // 函数调用
    doPrint(); // 函数调用
    std::cout << "Ending main()" << std::endl;
    return 0;
} 

C++ 入门(三)— 函数_第1张图片

C++ 中不支持嵌套函数

函数返回值

编写用户定义的函数时,可以确定函数是否会将值返回给调用方。若要将值返回给调用方,需要满足以下两项要求。

首先,函数必须指示将返回的值类型。这是通过设置函数的返回类型来完成的,该类型是在函数名称之前定义的类型。

其次,在将返回值的函数中,我们使用 return 语句来指示返回给调用方的特定值。从函数返回的特定值称为返回值。执行 return 语句时,函数立即退出,并将返回值从函数复制回调用方。此过程称为按值返回。

#include 

int getValueFromUser()//获取用户输入的值
{
  std::cout << "Enter an integer: ";
 int input{};
 std::cin >> input;
 return input; // 返回 input 的值
}

int main()
{
 int num { getValueFromUser() };//使用getValueFromUser()的返回值初始化num
 std::cout << num << " doubled is: " << num * 2 << '\n';
 return 0;
}

请添加图片描述

C++标准仅定义了 3 个状态代码的含义:0、EXIT_SUCCESS 和 EXIT_FAILURE。0 和 EXIT_SUCCESS 都表示程序已成功执行。EXIT_FAILURE表示程序未成功执行。

如果未提供 return 语句,函数 main 将隐式返回 0。

Void 函数(非值返回函数)

Void 返回值

函数不需要将值返回给调用方。为了告诉编译器函数不返回值,请使用返回类型 void。

注意事项:

  • void 函数不需要 return 语句;
  • Void 函数不能用于需要值的表达式;
  • 从 void 函数返回值是编译错误;

函数参数和参数

函数参数是函数标头中使用的变量。函数参数的工作方式与函数内部定义的变量几乎相同,但有一个区别:它们使用函数调用者提供的值进行初始化。

函数参数在函数标头中定义,方法是将它们放在函数名称后面的括号之间,多个参数用逗号分隔。

void doPrint()
{
    std::cout << "In doPrint()\n";
}

void printValue(int x)
{
    std::cout << x  << '\n';
}
int add(int x, int y)
{
    return x + y;
}

局部范围

局部变量
在函数主体内定义的变量称为局部变量。

int add(int x, int y)
{
    int z{ x + y }; // z 是一个局部变量

    return z;
}

局部变量生命周期
大多数情况下,局部变量是在输入函数时创建的,并在退出函数时以相反的创建顺序销毁。

int add(int x, int y)
{
    int z{ x + y };

    return z;
} // z, y, x 在这时销毁

临时对象
临时对象(有时也称为匿名对象)是由编译器创建的用于临时存储值的未命名对象。

#include 

int getValueFromUser()
{
  std::cout << "Enter an integer: ";
 int input{};
 std::cin >> input;

 return input; // 将输入的值返回给调用者
}

int main()
{
 std::cout << getValueFromUser() << '\n'; 

 return 0;
}

在上面的程序中,该函数将存储在局部变量中的值返回给调用者。由于将在函数结束时销毁,因此调用方将收到该值的副本,以便它具有即使在销毁后也可以使用的值。

函数的声明和定义

正向声明允许我们在实际定义标识符之前告诉编译器标识符的存在。

对于函数,这允许我们在定义函数的主体之前告诉编译器函数的存在。这样,当编译器遇到对函数的调用时,它会理解我们正在进行函数调用,并可以检查以确保我们正确调用函数,即使它还不知道函数的定义方式或位置。

要为函数编写正向声明,我们使用函数声明语句(也称为函数原型)。函数声明由函数的返回类型、名称和参数类型组成,以分号结尾。可以选择包含参数的名称。函数体不包含在声明中。

在 C++ 中,所有定义都是声明。因此,它既是一个定义,也是一个声明。int x;

相反,并非所有声明都是定义。不是定义的声明称为纯声明。纯声明的类型包括函数、变量和类型的正向声明。

#include 

int add(int x, int y); // add()的前向声明(使用函数声明)

int main()
{
    std::cout << "The sum of 3 and 4 is: " << add(3, 4) << '\n'; 
    return 0;
}

int add(int x, int y) // 主体直到这里才定义
{
    return x + y;
}

具有多个代码文件的程序

对于 VS Code 用户

若要创建新文件,请从顶部导航栏中选择“查看>资源管理器”以打开“资源管理器”窗格,然后单击项目名称右侧的“新建文件”图标。或者,从顶部导航栏中选择“文件”>“新建文件”。然后为您的新文件命名(不要忘记 .cpp 扩展名)。如果文件显示在 .vscode 文件夹中,请将其向上拖动一级到项目文件夹。

接下来打开tasks.json文件,找到 .“${file}”,

您在这里有两个选择:

如果您希望明确要编译哪些文件,请替换为要编译的每个文件的名称,每行一个,如下所示:“${file}”, “main.cpp”,
“add.cpp”,

读取器“geo”报告,你可以让 VS Code 通过替换为 (在 Windows 上) 来自动编译目录中的所有 .cpp
文件。“ f i l e " , " {file}"," file","{fileDirname}\.cpp" Reader “Orb” 报告适用于
Unix。"${fileDirname}/
.cpp”

你可能感兴趣的:(C++,开发之路,c++,开发语言,vscode)