C++函数(个人第二次作业)
一.为什么要使用函数
C++继承了C语言的全部语法,当然也包括了函数的定义与使用方法。在面向过程的结构化程序设计中,函数是模块划分的基本单位,是处理问题过程中的一种抽象。在面向对象的程序设计中,函数同样有着重要的作用,它是面向对象程序设计中对功能的抽象。一个比较复杂的系统往往需要划分为若干子系统,然后分别对这些子系统分别进行开发和调试。高级语言中的子程序就是用来实现这种模块划分的。C++语言中的子程序体现为函数。通常将独立的经常使用的功能抽象为函数。函数编写好以后,可以被重复使用,使用时可以只关心函数的功能和使用方法而不必关心函数功能的具体实现。这样有助于代码重用,可以提高开发效率,增强程序的可靠性,也便于分工合作和修改维护。
简而言之,使用函数的原因有这几点:
1模块化程序,便于开发和维护
2提高开发效率
3增强程序的可靠性
二.为什么要用函数重载
一个函数有多种构造情况的时候需要用构造函数的重载,C++允许功能相近的函数在相同的作用域内以相同函数名定义,从而形成重载。这也方便我们开发人员使用和记忆。
举下例子吧:
#include<iostream>
using namespace std:
int sumofsquare(int a,int b)
{
return a*a+b*b;
}
double sumofsquare(double a,double b);
{
return a*a+b*b;
}
int main()
{
.......
return 0;
}
以上便是两个功能一样的函数,只是参数类型有所不同,因而我们以相同函数名为其命名。
值得注意的是:
重载函数的形参必须不同:个数不同或者类型不同。
编译程序会自动根据你写的程序来调用哪一个函数。
另外,不要将不同功能的函数定义为重载函数,以免出现对调用结果的误解和混淆。
三.什么是值传递
值传递是指当发生函数调用时,给形参分配内存空间,并用实参来初始化形参(直接将实参的值传递给形参)。这一过程是参数值的单向传递过程,一旦形参获得了值便与实参脱离关系,此后无论形参发生了怎样的改变,都不会影响到实参。
举个例子:
#include<iostream>
using namespace std;
void swap(int a,int b)
{
int t=a;
a=b;
b=t;
}
int main()
{
int x=5,y=10;
swap(x,y);
cout<<"x="<<x<<"y="<<y<<endl;
return 0;
}
运行结果是x=5,y=10;
从这个运行结果来看并没有达到交换的。这是因为采用的是值传递,形参改变的值并不影响实参,因而实参并没有交换。
四.什么是地址传递
地址传递方式使用数组名或者指针作为函数参数,传递的是该数组的首地址或指针的值,而形参接收到的是地址,即指向实参的存储单元,形参和实参占用相同的存储单元,这种传递方式称为“参数的地址传递”。
举个例子:
#include<iostream>
using namespace std;
void swap(int *a,int* b)
{
int t=*a;
*a=*b;
*b=t;
}
int main()
{
int x=5,y=10;
swap(&x,&y);
cout<<"x="<<x<<"y="<<y<<endl;
return 0;
}
运行结果是x=10,y=5;
五.如何编写递归函数
什么是递归呢?简单的定义: “当函数直接或者间接调用自己时,则发生了递归.”从定义可见,递归函数就是函数引用自身。
举个常见的例子吧——阶乘,阶乘指从1乘以2乘以3乘以4一直乘到所要求的数。
#include<iostream>
using namespace std;
int Fac(int n)
{
if(n==0)//递归边界
return 1;
else
return n*Fac(n-1);//递归公式
}
int main()
{
int n;
cin >> n;
cout << Fac(n) << endl;
return 0;
}
递归有两个要素
1.递归边界
2.递归的逻辑——递归"公式"
上述的阶乘中,我们要求n的阶乘,但肯定一下子不知道结果,但我们退而其次求n-1的阶乘,n-1的也不知道,继续求n-2的,最后一直求到0的阶乘,这下知道了0的阶乘等于1,这便是边界,而前面的过程就是递归的公式。
采用递归函数呢,可以使编写函数变得简单,但也会增大内存的占用量。