练习6.1:实参和形参的区别是什么?
实参是形参的初始值。
形参是在函数列表里定义的变量
练习 6.4:编写一个与用户交互的函数,要求用户输入一个数字,计算生成该数字的阶乘。在main函数中调用该函数。
#include <iostream>
using namespace std;
int mul(int n)
{
int sum = 1;
while (n > 1)
{
sum *= n--;
}
return sum;
}
int main(void)
{
int n;
cout << "Please enter num" << endl;
cin >> n;
cout << mul(n) << endl;
return 0;
}
编写一个函数输出其实参的绝对值
#include <iostream>
using namespace std;
int abs(int n)
{
if (n > 0)
return n;
else
return (-n);
}
int main(void)
{
int n;
cout << "Please enter num" << endl;
cin >> n;
cout << abs(n) << endl;
return 0;
}
练习6.7:编写一个函数,当他第一次被调用时返回0,以后每次被调用返回值加1
#include <iostream>
using namespace std;
void funcc()
{
static int x = 0;
cout << x++ << " ";
}
int main(void)
{
for (int i = 0; i < 10; i++)
{
funcc();
}
}
练习6.10:编写一个函数,使用指针形参交换两个整数的值。在代码中调用该函数并输出交换后的结果
#include <iostream>
using namespace std;
void exchange(int * x, int * y)
{
int temp = *x;
*x = *y;
*y = temp;
}
int main(void)
{
int x = 5;
int y = 10;
exchange(&x, &y);
cout << x << " " << y << endl;
return 0;
}
练习6.11:编写reset函数,用引用类型的参数。
#include <iostream>
using namespace std;
void reset(int &i)
{
i = 10;
}
int main()
{
int j = 42;
cout << j << endl;
reset(j);
cout << j << endl;
return 0;
}
练习6.13:假设T是某种类型的名字,说明以下两个函数声明的区别:一个是void f(T),宁一个是void f(T&)
void f(T):形参是实参一个副本,在上面做任何改动都影响不了实参
void f(T&):形参是实参的一个别名,可以改动实参
练习6.20:引用形参什么时候应该是常量引用?如果形参应该是常量引用,而我们将其设为了普通引用,会发生什么?
- 不用改变参数的时候设置位常量引用。
- dev c++我试了编译不通过,看网上说当不去改变他时不会报错。
initializer_list
image.png
练习6.27:编写一个函数,他的参数是initializer_list<int>类型的对象计算所有元素的和
#include <iostream>
using namespace std;
void sum(initializer_list<int> const &x);
int main()
{
sum({1,2,3,4,5,6});
sum({1,2,3});
return 0;
}
void sum(initializer_list<int> const &x)
{
int sum = 0;
for (auto &i : x)
sum += i;
cout << sum << endl;
}
练习6.31:什么情况下返回的引用无效?什么情况下返回常量的引用无效?
返回局部对象的引用和局部的临时量
constexpr函数
函数的返回类型及所有形参的类型都得是字面值类型,而且函数体中必须有且只有一条return语句
练习6.49:什么是候选函数?什么是可行函数?
- 候选函数: 一是与被调用的函数同名,二是其声明在调用点可见。
- 可行函数:一是其形参数量与本次调用提供的实参数量相等。二是每个实参的类型与对应的形参类型相同或者可以转换成形参的类型