C++面向对象——第二次作业
一、为什么要用函数?
1、使程序中的代码模块化、相对独立,方便快速重复调用一串代码。
2、减少代码量,界面看起来简洁,增强代码的可读性。
3、便于调试、修改和维护。
交换a,b的值
#include <iostream>
using namespace std;
void swap(int *a, int *b)
{
int temp;
temp = *a;
*a = *b;
*b = temp;
}
int main()
{
int a;
int b;
cout << "请输入a,b的值:" << endl;
cin >> a >> b;
swap(a, b);
cout << "a=" << a << " b=" << b<<endl;
return 0;
}
总结
有了函数之后,代码显而易见的被模块化分开,无论是阅读,还是调试,都非常方便。
二、为什么要用函数重载?
主要是为了解决函数命名冲突的问题,可以用来实现功能类似而所处理的数据类型不同的问题。
求两整数或实数相加
#include <iostream>
using namespace std;
int add(int x,int y)
{
return x + y;
}
double add(double x, double y)
{
return x + y;
}
int main()
{
int a;
int b;
cout << "请输入两个整数:";
cin >> a >> b;
cout << "它们的和是:" << add(a, b) << endl;
double c;
double d;
cout << "请输入两个实数:";
cin >> c >> d;
cout << "它们的和是:" << add(c, d) << endl;
}
总结
两个重载函数必须在下列一个或两个方面有所区别:
1、函数的参数个数不同。
2、函数的参数类型不同或者参数类型顺序不同。
三、什么是值传递?
仅仅是把实参的值传递给形参,之后形参的值无论如何变化都与实参无关。
值传递
void swap1(int p, int q)
{
int temp;
temp = p;
p = q;
q = temp;
cout << p << " " << q << endl;
}
int main()
{
int a = 1, b = 2;
swap1(a, b);
//swap2(&a,&b);
//swap3(a,b);
cout << a << " " << b << endl;
return 0;
}
由此,我们可以看见其实形参p,q的值是交换了的,但是最终输出的a,b值并没有交换。因为值传递是仅仅传值,实参a,b不受影响。
总结
优点:调用者可以保护自己空间的值不会被修改。
缺点:因为每次调用都会传递一次副本,因此内存消耗很大,工程中不建议使用。
四、什么是地址传递?
将实参的地址传递给形参,形参从而指向实参的地址,在形参发生改变时,相当于指向实参地址中的值发生改变。
地址传递
void swap2(int *p, int *q)
{
int temp;
temp = *p;
* p = *q;
* q = temp;
}
int main()
{
int a = 1, b = 2;
//swap1(a, b);
swap2(&a,&b);
//swap3(a,b);
cout << a << " " << b << endl;
return 0;
}
a,b的值实现了交换,在这个过程中,相当于将a,b的地址赋给p,q,之后交换地址中的值,从而a,b所在地址中的值也跟着变。
总结
1、调用者让被调者修改自己空间的值
2、用在连续空间的传递
(三、四参考于<值传递与地址传递(C语言)>)
五、设计实验教案,分析如何编写递归函数?
定义:函数直接或间接调用自己。把一个大型复杂的问题一步步转化为一个个与原问题相关的规模较小的小问题来求解。
写递归应该具备的条件:
1、递归表达式
2、结束条件
(n!的递归)
#include <iostream>
using namespace std;
int J(int n);
int J(int n)
{
if (n == 1)
return 1;
else
return n*J(n - 1);
}
int main()
{
int a;
cout << "请输入a:" ;
cin >> a;
J(a);
cout << "a的阶乘是:" << J(a);
}
总结
1、为防止递归无休止的调用,递归必须设置递归终止条件
2、汉诺塔、菲波那切数列用递归更简单
3、递归虽然简化程序,但降低程序执行效率,一个字,慢