章节回顾
函数是旨在完成特定工作的可重用语句序列。您自己编写的函数称为用户定义函数。
函数调用是告诉 CPU 执行函数的表达式。发起函数调用的函数是调用者,被调用的函数是被调用者或被调用函数。进行函数调用时不要忘记包含括号。
函数定义中的花括号和语句称为函数体。
有返回值的函数称为返回值函数。函数的返回类型指示函数将返回的值的类型。return语句确定返回给调用者的具体返回值。返回值从函数复制回调用者——这个过程称为按值返回。无法从非 void 函数返回值将导致未定义的行为。
函数main的返回值称为状态代码,它告诉操作系统(以及调用您的程序的任何其他程序)您的程序是否成功执行。根据共识,返回值 0 表示成功,非零返回值表示失败。
练习DRY编程——“不要重复自己”。利用变量和函数删除冗余代码。
返回类型为void的函数不会向调用者返回值。不返回值的函数称为void 函数或无值返回函数。在需要值的地方无法调用 void 函数。
不是函数中最后一条语句的 return 语句称为提前返回。这样的语句会导致函数立即返回到调用者。
函数参数是函数中使用的变量,其值由函数的调用者提供。参数是从调用者传递给函数的特定值。当参数被复制到参数中时,这称为按值传递。
函数参数和函数体内定义的变量称为局部变量。变量存在的时间称为其生命周期。变量在运行时创建和销毁,即程序运行时。变量的作用域决定了可以在何处查看和使用它。当一个变量可以被看到和使用时,我们说它在范围内。当它看不到时,就不能使用,我们就说它超出了范围。范围是一个编译时属性,这意味着它在编译时强制执行。
空白是指用于格式化目的的字符。在 C++ 中,这包括空格、制表符和换行符。
前向声明允许我们在实际定义标识符之前告诉编译器标识符的存在。要为函数编写前向声明,我们使用函数原型,其中包括函数的返回类型、名称和参数,但没有函数体,后跟分号。
定义实际上实现(对于函数和类型)或实例化(对于变量)标识符。声明是告诉编译器标识符存在的语句。在 C++ 中,所有定义都充当声明。纯声明是不是定义的声明(例如函数原型)。
大多数重要的程序都包含多个文件。
当两个标识符以编译器或链接器无法区分的方式引入同一程序时,编译器或链接器将因命名冲突而出错。命名空间保证命名空间内的所有标识符都是唯一的。std 命名空间就是这样的命名空间之一。
预处理器是在代码被编译之前运行的进程。指令是对预处理器的特殊指令。指令以 # 符号开头,以换行符结束。宏是定义如何将输入文本转换为替换输出文本的规则。
头文件是设计用于将声明传播到代码文件的文件。使用#include指令时,#include指令将替换为包含文件的内容。包含标头时,在包含系统标头(例如 C++ 标准库中的标头)时使用尖括号,在包含用户定义标头(您编写的标头)时使用双引号。包含系统头文件时,请包含不带 .h 扩展名的版本(如果存在)。
头文件保护可防止标头内容多次包含到给定的代码文件中。它们不会阻止标头的内容包含到多个不同的代码文件中。
小测验时间
请务必使用编辑器的自动格式设置功能来保持格式一致并使代码更易于阅读。
问题#1:编写一个单文件程序(名为 main.cpp),从用户那里读取两个单独的整数,将它们加在一起,然后输出答案。
该程序应使用三个函数:
应使用名为“readNumber”的函数从用户获取(并返回)单个整数。
应使用名为“writeAnswer”的函数来输出答案。
该函数应该采用单个参数并且没有返回值。
应使用 main() 函数将上述函数粘合在一起。
提示:您不需要编写单独的函数来进行加法(只需直接使用operator+)。
提示:您需要调用 readNumber() 两次。
main.cpp
#include <iostream>
int readNumber()
{
std::cout << "Enter a number to add: ";
int x {};
std::cin >> x;
return x;
}
void writeAnswer(int x)
{
std::cout << "The answer is " << x << '\n';
}
int main()
{
int x { readNumber() };
int y { readNumber() };
writeAnswer(x + y); // using operator+ to pass the sum of x and y to writeAnswer()
return 0;
}
问题#2:修改您在练习 #1 中编写的程序,以便 readNumber() 和 writeAnswer() 位于名为“io.cpp”的单独文件中。
使用前向声明从 main() 访问它们。
如果您遇到问题,请确保“io.cpp”已正确添加到您的项目中,以便对其进行编译。
io.cpp:
#include <iostream>
int readNumber()
{
std::cout << "Enter a number to add: ";
int x {};
std::cin >> x;
return x;
}
void writeAnswer(int x)
{
std::cout << "The answer is " << x << '\n';
}
main.cpp
// We don't need to #include <iostream> since main.cpp doesn't use any input/output functionality
// These are the forward declarations for the functions in io.cpp
int readNumber();
void writeAnswer(int x);
int main()
{
int x { readNumber() };
int y { readNumber() };
writeAnswer(x+y);
return 0;
}
问题#3:修改您在 #2 中编写的程序,以便它使用头文件(名为 io.h)来访问函数,而不是直接在代码 (.cpp) 文件中使用前向声明。
确保您的头文件使用头保护。
io.h:
#ifndef IO_H
#define IO_H
int readNumber();
void writeAnswer(int x);
#endif
io.cpp:
#include "io.h"
#include <iostream>
int readNumber()
{
std::cout << "Enter a number to add: ";
int x {};
std::cin >> x;
return x;
}
void writeAnswer(int x)
{
std::cout << "The answer is " << x << '\n';
}
main.cpp
#include "io.h"
int main()
{
int x { readNumber() };
int y { readNumber() };
writeAnswer(x+y);
return 0;
}
原创文章,作者:jkhxw,如若转载,请注明出处:https://www.jkhxw.com/chapter-3-summary-and-quiz/