一、形参默认值
通常情况下,由实参负责传值给形参。有时,也可以定义形参的默认值,当函数调用时 没提供对应的实参时,形参采用默认值。 当函数有多个形参时,有默认值的形参必须放在最后。
【例 1】带默认值的形参
#include<iostream>
using namespace std;
void f(int n = 10)
{
for (int i = 0; i < n; i++)
{
cout << "*";
}
cout << endl;
}
int main()
{
f(5);
f();
return 0;
}
运行结果:
*****
**********
说明:调用 f(5)时,实参 5 传给了形参 n,故 n 不采用默认值 10;调用 f()时,由于没有实
参,故形参 n 采用默认值 10。
【例 2】多个形参中有默认值的靠后
#include<iostream>
using namespace std;
double f(int a, double b = 10, int c = 100)
{
return a + b + c;
}
int main()
{
cout << f(1, 2, 3) << endl;
cout << f(1, 2) << endl;
cout << f(1) << endl;
return 0;
}
运行结果:
6
103
111
说明:调用 f(1, 2, 3)时,a=1, b=2, c=3;调用 f(1,2)时,a=1, b=2, c=100;调用 f(1)时,a=1,
b=10, c=100。
如果把 f 定义成 double f(double b = 10, int a, int c = 100),则会编译报错,因为 b 有默
认值但没有靠后。
二、函数声明
函数必须先定义后使用,这点跟变量相同,因而所有在 main 函数里调用的自定义函数 都必须在 main 函数之前定义。对于很长的程序,这样做会很不方便找到 main 函数在哪儿。 另外还有一些其他原因也会导致无法做到先定义函数。 可以先对要定义的函数进行声明,这样就可以放在靠后的位置定义函数。
【例 3】函数声明
#include<iostream>
using namespace std;
int f(int a, int b); //函数声明
int main()
{
cout << f(1, 2) << endl;
return 0;
}
int f(int a, int b) //函数定义(函数实现)
{
return a + b;
}
上面的代码相当于
#include<iostream>
using namespace std;
int f(int a, int b)
{
return a + b;
}
int main()
{
cout << f(1, 2) << endl;
return 0;
}
说明:函数声明就是把函数头单独成一句话(要记得加分号;)。当函数声明后,即可以调用,
但要记得在后面实现函数的定义。
三、函数嵌套
函数嵌套是指函数调用时可以嵌套调用,函数定义不能嵌套在另一个函数定义中(匿名
函数除外,还没讲到)。
一个函数可以把另一个函数(包括自己,不可以是 main 函数)的返回值作为实参(只
能当右值用,对应的不能是引用形参)。
【例 4】嵌套调用
#include<iostream>
using namespace std;
int f(int a, int b)
{
return a + b;
}
int g(int a)
{
return a * 2;
}
int main()
{
cout << f(f(1, 2), f(3, 4)) << endl;
cout << g(g(5)) << endl;
cout << g(f(6, 7)) << endl;
return 0;
}
运行结果:
10
20
26
说明:f(f(1, 2), f(3, 4))中,外层的 f 函数的第一个实参是 f(1, 2)的返回值 3,第二个实参是 f(3,
4)的返回值 7,故相当于 f(3,7),所以返回 10。
g(g(5))中,外层的 g 函数的实参是 g(5)的返回值 10,故相当于 g(10),所以返回 20。
g(f(6,7))中,外层 g 函数的实参是 f(6,7)的返回值 13,故相当于 g(13),所以返回 26。
【例 7】最大公因数(函数代码)
方法二:辗转相除法(最大公因数的最快计算方法)
求正整数 a 和 b 的最大公因数
1、c=a%b,a=b,b=c
2、一直重复上述三句话,直到 b 等于 0 为止,此时 a 的值就是原来 a 和 b 的最大公因数。
例如 a=6, b=26
① c=6, a=26, b=6 ② c=2, a=6, b=2 ③ c=0, a=2, b=0
结束,此时 a=2,是 6 和 26 的最大公因数
int getGCD(int a, int b)
{
int c;
while (b != 0)//当退出循环的时候,b==0
{
c = a%b;
a = b;
b = c;
}
return a;
}