一、引用形参
函数定义时,引用形参的类型后面(即参数名字前面)需要加&,例如 void f(int& a)。 当形参是引用形参时,实参必须是相同数据类型的左值(形参是非引用形参时,实参必须是 右值)。要注意,在函数调用时,实参名字前面不要加&,无论对应的是非引用形参还是引用 形参。
当形参定义成引用形参时,那么形参和实参事实上是同一个左值。如果在函数中形参的 值发生了改变,会同时影响实参的值。(如果是非引用实参,只在函数调用时把实参值赋值给形参,此后函数中任何形参的变化都不会影响实参的值)
二、有返回值函数
1、如果函数 f 定义成 void f(…),那么称 f 是无返回值的函数(因为 void 表示无返回值)。如 果 void 改成 int、double、char、bool 等类型,则称 f 是有返回值的函数。
2、有返回值的函数需要在函数中使用 return 语句返回具体的值,这个值由函数的功能决定。 无返回值的函数通常不会有 return 语句,如果需要也可以使用 return;
3、在任何情况下,一个函数执行到 return 语句就会立即结束该函数的运行,无论函数中是 否还有未执行完的代码。
【例 6】圆的面积计算公式是𝑆 = 𝜋𝑟
2。写一个函数 double getArea(double r),可以根据半
径 r 返回圆的面积。在主函数中输出半径为 10 和半径为 5.5 的圆的面积。其中 π 的值使用
3.14。
#include<iostream>
using namespace std;
double getArea(double r)
{
const double pi = 3.14;
return pi*r*r;
}
int main()
{
cout << getArea(10) << endl;
cout << getArea(5.5) << endl;
return 0;
}
【说明】
1、const 关键字表明,pi 是常量。常量必须要在定义时提供初始值(3.14),并且在随后的
代码中不可以改变这个值。
2、注意这个函数的返回值得是 double,否则会有精度损失。
【例 7】输入一个正整数 n,然后输入 n 个整数,如果该整数是质数则输出 Yes,否则输出
No,每个整数判断输出完都要换行。
#include<iostream>
#include<cmath>
using namespace std;
bool isPrime(int n)
{
if (n < 2)
{
return false;
}
for (int i = 2; i <= sqrt(n); i++)
{
if (n % i == 0)
{
return false;
}
}
return true;
}
int main()
{
int n;
cin >> n;
while (n--)
{
int a;
cin >> a;
if (isPrime(a))
{
cout << "Yes" << endl;
}
else
{
cout << "No" << endl;
}
}
return 0;
}
【说明】
1、bool 类型返回值的函数通常用来判定一件事是真还是假,函数调用时当作 bool 类型的
右值。
2、bool 类型返回值的函数通常应该作为 if(...)里面的判断,或者 while(...)里面的判断。当然
必要时赋值和输出也是可以的。
3、if (isPrime(a))的意思是如果 isPrime(a)的返回值为真,则进入 if 分支。
Important:
【例 8】利用上一个例子中判定质数的函数,输入一个正整数 m,输出 2 到 m 之间(包含
2 和 m)所有质数之和。
#include<iostream>
#include<cmath>
using namespace std;
bool isPrime(int n)
{
if (n < 2)
{
return false;
}
for (int i = 2; i <= sqrt(n); i++)
{
if (n % i == 0)
{
return false;
}
}
return true;
}
int main()
{
int m, sum = 0;
cin >> m;
for (int i = 2; i <= m; i++)
{
if (isPrime(i))
{
sum += i;
}
}
cout << sum;
return 0;
}