c++函数及其应用
1.为什么要用函数
一个较为复杂的系统往往需要划分为若干个子系统,然后对这些子系统分别进行开发和调试。c++语言中的子程序体系为函数。函数编写后,可以被重复使用,
使用时可以只关心函数的功能和使用方法而不必关心函数功能的具体实现。这样有利于代码重用,可以提高开发效率,增强程序的可靠性,也便于分工合作和
修改维护。
2.为什么要使用函数重载
两个以上的函数,具有相同的函数名。但是形参的个数和或者类型不同,编译器根据实参和形参的类型及个数的最佳匹配,自动确定调研哪一个函数,这就是
函数的重载。
如果没有重载机制,那么对不同类型的数据进行相同的操作也需要定义名称完全不同的函数,列如定义加法函数,就必须这样对整数的加法和浮点数的加法使
用不同的函数名:
int iadd(int x,int y); float fadd (float x,float y);
这样调用就非常不方便
重载后:
int add(int x,int y); float add(float x,float,y); //形参类型不同 int add(int x,int y); int add(int x,int y,int z); //形参个数不同
3.值传递和地址传递
C++的按值传递和按地址传递有明显不同,下面对他们作个区别:
按值传递:在调用函数中将原函数的值拷贝一份过去被调用的函数,在被调用函数中对该值的修改不会影响原函数的值。
按地址传递:在调用函数的时候将原函数的值所在的地址拷贝一份过去,被调用函数对这个地址所作的修改会影响原来的值。
1.按值传递
#include<iostream> using namespace std; void changeNumber(int x); int main(void){ int a = 10; cout << "a = " << a << endl; changeNumber(a); cout << "Now a = " << a << endl; return 0; } void changeNumber(int x){ x = x + 5; }
这里的运行结果是
2.按地址传递
#include<iostream> using namespace std; void changeNumber(int &x); int main(void){ int a = 10; cout << "a = " << a << endl; changeNumber(a); cout << "Now a = " << a << endl; return 0; } void changeNumber(int &x){ x = x + 5; }
main()函数调用changeNumber()的时候,将a的地址,也就是&a传递给changeNumber()函数,这实际上就是将a的地址拷贝一份过去给changeNumber()函数,在前面的例子中,main()拷贝并传递的是a,这里main()拷贝并传递的是&a,两者都可以理解为按值传递,只不过第二个例子中的“值”是a的地址而已。
4.递归函数
构成递归需具备的条件:
1.子问题须与原始问题为同样的事,且更为简单。
2.不能无限制的调用本身,必须有个出口,化简为非递归状况处理。
实列:阶乘
#include <iostream> using namespace std; int Leo(int n){ int sum = 1; if(1 == n)//递归终止条件 { return 1; } sum =n * Leo(n - 1); return sum;//返回阶乘的总和 } int main(){ int num; cin >> num;//输入一个数 cout << Leo(num) << endl; //输出该数的阶乘 return 0;
} //在求X的阶乘和时可以利用递归的思想把大问题转化成小问题再把小问题转化成更小的问题最后得解