文章目录
- 函数简介
- 函数返回值
- Void 函数(非值返回函数)
- 函数参数和参数
- 局部范围
- 函数的声明和定义
- 具有多个代码文件的程序
函数简介
C++ 程序的方式工作。当程序遇到函数调用时,它将在一个函数内按顺序执行语句。函数调用是告诉 CPU 中断当前函数并执行另一个函数的表达式。CPU 在当前执行点“放置一个标记”,然后调用(执行)函数调用中指定的函数。当调用的函数结束时,CPU 将返回到它添加标记的点,并继续执行。
下面是一个示例程序,演示如何定义和调用新函数:
#include <iostream>
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++ 中不支持嵌套函数
函数返回值
编写用户定义的函数时,可以确定函数是否会将值返回给调用方。若要将值返回给调用方,需要满足以下两项要求。
首先,函数必须指示将返回的值类型。这是通过设置函数的返回类型来完成的,该类型是在函数名称之前定义的类型。
其次,在将返回值的函数中,我们使用 return 语句来指示返回给调用方的特定值。从函数返回的特定值称为返回值。执行 return 语句时,函数立即退出,并将返回值从函数复制回调用方。此过程称为按值返回。
#include <iostream>
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 <iostream>
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 <iostream>
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”