程序员编写的功能通常需要原型。就像蓝图一样,原型告诉编译器该函数将返回什么,该函数将被调用什么以及该函数可以传递哪些参数。当我说该函数返回一个值时,我的意思是该函数可以与变量使用相同的方式使用。例如,可以将变量设置为等于返回零至四之间的值的函数。
例如:
#include <cstdlib> // Include rand()
using namespace std; // Make rand() visible
int a = rand(); // rand is a standard function that all compilers have
不要以为’a’会随机改变,它会被设置为调用函数时返回的值,但不会再次改变。
原型的一般格式很简单:
return-type function_name ( arg_type arg1, ..., arg_type argN );
arg_type仅表示每个参数的类型-例如,一个int,一个float或一个char。这与声明变量的内容完全相同。
传递给一个函数的参数可以不止一个,也可以不传递任何参数(括号为空),并且不必返回值。不返回值的函数的返回类型为void。让我们看一个函数原型:
int mult ( int x, int y );
此原型指定函数mult将接受两个参数(均为整数),并将返回一个整数。不要忘记尾随的分号。没有它,编译器可能会认为您正在尝试编写函数的实际定义。
当程序员实际定义函数时,它将从原型开始,减去分号。然后,应该始终有一个包含要执行该功能的代码的块,就像您为主要功能编写该代码一样。传递给函数的任何参数都可以像在块中声明的那样使用。最后,以樱桃和右括号结束所有内容。好吧,也许不是樱桃。
让我们看一个示例程序:
#include <iostream>
using namespace std;
int mult ( int x, int y );
int main()
{
int x;
int y;
cout<<"Please input two numbers to be multiplied: ";
cin>> x >> y;
cin.ignore();
cout<<"The product of your two numbers is "<< mult ( x, y ) <<"\n";
cin.get();
}
int mult ( int x, int y )
{
return x * y;
}
该程序从唯一必需的包含文件和使std名称空间可见的指令开始。标准标头中的所有内容都在std名称空间内部,除非我们这样做,否则它们对我们的程序不可见。接下来是该函数的原型。请注意,它具有最后的分号!主函数返回一个整数,您应该始终必须遵守该整数。您应该不难理解输入和输出功能。像程序一样,可以使用cin输入变量。但是,在键入数字时,请确保将它们用空格隔开,以便cin可以区分它们并将它们放在正确的变量中。
注意,cout实际上是如何输出看似多重功能的。实际发生的情况是cout打印的是mult返回的值,而不是mult本身。结果将与我们使用此打印件相同
cout<<"The product of your two numbers is "<< x * y <<"\n";
实际上,mult函数是在main下面定义的。由于其原型位于main之上,因此编译器仍将其识别为已定义,因此编译器不会给出有关unult未定义的错误。只要存在原型,即使没有定义也可以使用函数。但是,即使可以编译,代码也不能在没有定义的情况下运行。原型和定义也可以合并为一个。如果在使用mult之前就对其进行了定义,那么我们可以取消该原型,因为该定义也可以充当原型。
Return是用于强制函数返回值的关键字。请注意,可能有一个不返回任何值的函数。如果函数返回void,则return语句有效,但仅当它不具有表达式时才有效。换句话说,对于返回void的函数,语句为“ return;”。是合法的,但多余的。
最重要的功能性问题(半双关)是为什么我们需要一个功能?功能有很多用途。例如,程序员可能拥有一段代码,他在整个程序中重复了四十次。执行该代码的函数可以节省大量空间,并且还可以使程序更具可读性。同样,只有一个代码副本可以使更改变得更容易。您是否愿意对一个潜在的大型程序分散四十个小的更改,或者对功能主体进行一次更改?我也会。
使用功能的另一个原因是将复杂的程序分解为逻辑部分。例如,选择在选择菜单时运行复杂代码的菜单程序。该程序最好通过为每个实际菜单选项创建功能,然后将复杂的任务分解为更小,更易于管理的任务来完成,这些任务可以在其自身的功能中进行。这样,可以设计一个在读取时有意义的程序。并且具有易于理解的结构。最差的程序通常仅具有所需的函数main,并用混杂的代码页面填充该函数。