在之前的课程中,我们指出函数定义的语法看起来像这样:
returnType identifier() // identifier替换为您的函数名称
{
// 您的代码在这里
}
尽管我们展示了一些返回类型为void的函数示例,但我们没有讨论这是什么意思。在这节课中,我们将探索返回类型为void的函数。
空返回值的概念
函数不需要返回值给调用者。为了告诉编译器一个函数不返回值,我们使用void作为返回类型。例如:
#include <iostream>
// void表示该函数不返回值给调用者
void printHi()
{
std::cout << "Hi" << '\n';
// 这个函数不返回值,所以不需要返回语句
}
int main()
{
printHi(); // 可以:调用printHi()函数,不返回值
return 0;
}
在上面的例子中,printHi函数有一个有用的行为(它打印"Hi"),但它不需要返回任何东西给调用者。因此,printHi被赋予了void返回类型。 当main调用printHi时,printHi中的代码执行,“Hi"被打印。在printHi结束时,控制权返回到main,程序继续进行。
不返回值的函数被称为非值返回函数(或空函数)。
空函数的返回语句
空函数不需要返回语句 空函数将在函数末尾自动返回给调用者。不需要返回语句。
可以在空函数中使用返回语句(不带返回值)——这样的语句将导致函数在执行到返回语句时返回给调用者。这与函数末尾发生的事情是一样的。因此,在空函数末尾放置一个空返回语句是多余的:
#include <iostream>
// void表示该函数不返回值给调用者
void printHi()
{
std::cout << "Hi" << '\n';
return; // 告诉编译器返回给调用者——这是多余的,因为函数末尾无论如何都会返回!
} // 函数将在这里返回给调用者
int main()
{
printHi();
return 0;
}
最佳实践建议
最佳实践 不要在非值返回函数末尾放置返回语句。
空函数的使用限制
空函数不能用于需要值的表达式
一些类型的表达式需要值。例如:
#include <iostream>
int main()
{
std::cout << 5; // 可以:5是一个字面量值,我们将其发送到控制台以打印
std::cout << ; // 编译错误:没有提供值
return 0;
}
在上面的程序中,需要打印的值需要在std::cout «的右侧提供。如果没有提供值,编译器将产生语法错误。由于对std::cout的第二次调用没有提供要打印的值,这将导致错误。
现在考虑以下程序:
#include <iostream>
// void表示该函数不返回值给调用者
void printHi()
{
std::cout << "Hi" << '\n';
}
int main()
{
printHi(); // 可以:调用printHi()函数,不返回值
std::cout << printHi(); // 编译错误
return 0;
}
第一次调用printHi()是在不需要值的上下文中进行的。由于函数不返回值,这是可以的。 第二次调用printHi()函数甚至无法编译。函数printHi有一个void返回类型,意味着它不返回值。然而,这个语句试图将printHi的返回值发送到std::cout以打印。std::cout不知道如何处理这个(它应该输出什么值?)。因此,编译器将这标记为错误。您需要注释掉这行代码才能使您的代码编译。
函数调用上下文提示
提示 有些语句需要提供值,有些则不需要。 当我们有一个只包含函数调用的语句(例如上面例子中的第一个printHi())时,我们调用函数是为了其行为,而不是其返回值。在这种情况下,我们可以调用非值返回函数,或者我们可以调用值返回函数并忽略返回值。 当我们在需要值的上下文中调用函数(例如std::cout)时,必须提供值。在这种情况下,我们只能调用值返回函数。
#include <iostream>
// 不返回值的函数
void returnNothing()
{
}
// 返回值的函数
int returnFive()
{
return 5;
}
int main()
{
// 当单独调用函数时,不需要值
returnNothing(); // 可以:我们可以调用不返回值的函数
returnFive(); // 可以:我们可以调用返回值的函数,并忽略那个返回值
// 当在需要值的上下文中调用函数(如std::cout)
std::cout << returnFive(); // 可以:我们可以调用返回值的函数,并且值将被使用
std::cout << returnNothing(); // 编译错误:我们不能在这个上下文中调用返回void的函数
return 0;
}
空函数的返回值错误
从空函数返回值是编译错误 尝试从非值返回函数返回值将导致编译错误:
void printHi() // 这个函数是非值返回的
{
std::cout << "In printHi()" << '\n';
return 5; // 编译错误:我们试图返回一个值
}