形式参数和实际参数:
之前的课程中我们讲过函数可以通过return函数返回相应的值。
在大多数情况下,函数也需要接受一定的参数来进行处理。举个例子,我们需要一个计算两个值和的函数。这个时候该函数就需要输入两个值。
形式参数就是函数命名的时候括号里面的参数,多个参数用,隔开。下面是几个例子:
// This function takes no parameters
// It does not rely on the caller for anything
void doPrint()
{
std::cout << "In doPrint()" << std::endl;
}
// This function takes one integer parameter named x
// The caller will supply the value of x
void printValue(int x)
{
std::cout << x << std::endl;
}
// This function has two integer parameters, one named x, and one named y
// The caller will supply the value of both x and y
int add(int x, int y)
{
return x + y;
}
每个函数的参数都只在函数内部有效,因此即使printValue和add函数有相同名字的参数x,其实这两个x是毫不相关的。
实参就是实际传递给函数的参数值如下面所示:
printValue(6); // 6 is the argument passed to function printValue()
add(2, 3); // 2 and 3 are the arguments passed to function add()
实参的数目必须要和形式参数相同,否则编译器会报错。
形式参数和实际参数是如何工作的:
当一个函数被调用的时候,函数所有的参数都是作为变量来控制的,每一个变量的值都会匹配到相应的参数中。这个过程叫做值传递。
//#include "stdafx.h" // Visual Studio users need to uncomment this line
#include <iostream>
// This function has two integer parameters, one named x, and one named y
// The values of x and y are passed in by the caller
void printValues(int x, int y)
{
std::cout << x << std::endl;
std::cout << y << std::endl;
}
int main()
{
printValues(6, 7); // This function call has two arguments, 6 and 7
return 0;
}
参数和返回值是怎么工作的:
通过使用返回值和参数,我们可以创建一个函数,有输入值,也有输出值。下面是一个例子:
//#include "stdafx.h" // Visual Studio users need to uncomment this line
#include <iostream>
// add() takes two integers as parameters, and returns the result of their sum
// The values of x and y are determined by the function that calls add()
int add(int x, int y)
{
return x + y;
}
// main takes no parameters
int main()
{
std::cout << add(4, 5) << std::endl; // Arguments 4 and 5 are passed to function add()
return 0;
}
执行过程如下图:
下面是一个更加复杂的例子:
//#include "stdafx.h" // Visual Studio users need to uncomment this line
#include <iostream>
int add(int x, int y)
{
return x + y;
}
int multiply(int z, int w)
{
return z * w;
}
int main()
{
std::cout << add(4, 5) << std::endl; // within add(), x=4, y=5, so x+y=9
std::cout << multiply(2, 3) << std::endl; // within multiply(), z=2, w=3, so z*w=6
// We can pass the value of expressions
std::cout << add(1 + 2, 3 * 4) << std::endl; // within add(), x=3, y=12, so x+y=15
// We can pass the value of variables
int a = 5;
std::cout << add(a, a) << std::endl; // evaluates (5 + 5)
std::cout << add(1, multiply(2, 3)) << std::endl; // evaluates 1 + (2 * 3)
std::cout << add(1, add(2, 3)) << std::endl; // evaluates 1 + (2 + 3)
return 0;
}
前两行非常明确,第三行就是表示算式也可以作为参数,把起最终的计算结果给参数就可以了。
第四种add(a,a),前面定义了a为5。所以函数也就是add(5,5)
第五和第六中都是函数中调用函数,需要从里往外运算结果。
结论:
参数是使函数具有可重用性的关键机制,因为他允许在不知道输入值的情况下执行任务。这些输入值被调用者给传入。
返回值允许函数返回一个值给调用者。