一、为什么要用函数
函数是功能的抽象具体形式,在编程中使用函数不仅可以减少模块之间的耦合度,程序的主体看的不那么臃肿,还方便修改功能与代码重用,大大提升效率。
例如:
求x的n次方可以用以下函数:并且在复杂程序中可反复调用
#include <iostream> using namespace std;/*放主函数里边只主函数能用*/ double power(double x,int n){ /* x、n为局部变量*/ double val=1.0; while (n--) val*=x; return val;} int main (){ 执行函数时xn被分配空间,初始化形参 cout <<”5 to the power 2 is ”<<power(5,2)<<endl; /*执行到此处,再按f10则直接出结果 step into/f11再次进入函数 传值 计算 循环 返回主调函数 调用栈*/ Return 0;} /*函数原型声明出现在调用点之前即可。*/
二、函数重载
C++允许在同一范围中声明几个功能类似的同名函数,但是这些同名函数的形参必须不同。用同一个函数完成不同的功能就是重载函数。重载函数常用来实现功能类似而所处理的数据类型不同的问题。
注:函数的重载不能只有函数返回值类型不同,能不能重载主要看形参而返回值不是主要的方面。
#include<iostream> using namespace std; int Add(int a, int b) { ` return a + b; } double Add(float a, float b)
{ return a + b; }
int main() { cout<<Add(1,2)<<endl;
cout<<Add(3.5, 4.5)<<endl; 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; count <<”x=”<<x<<”y=”<<y<<endl; swap(x,y); count<<”x=”<<x<<”y=”<<y<<endl; return 0; }
若输入x=5,y=10我们期望通过这个函数令x=10,y=5但结果却没有变化
因为:在swap子函数中交换的一直是ab,主函数中的xy值传给ab进行交换,xy的值没有受到影响,这就是值传递,也就是形参值的改变没有影响到实参值。
c++中的引用类型语法形式:类型标识符&引用变量名
例如int i,j int &ri=i(int型的引用ri,相当于被初始化为了变量的一个别名) 与指针类似声明一个引用时,必须对他初始化
上个swap函数形参用引用类型时:
#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; count <<”x=”<<x<<”y=”<<y<<endl; swap(x,y); /*将实参变量与引用名进行关联,a的地址和x地址便相同了 count<<”x=”<<x<<”y=”<<y<<endl; return 0;
四、递归函数
直接或间接地调用函数本身则该函数称为递归函数 写递归函数要明确边界条件与递归公式。相比于迭代他程序要简单但占用的内存空间多。
课上讲的汉诺塔问题:
#include <iostream> using namespace std; void move(char src, char dest) { cout << src << "-->" << dest << endl; } void hanoi(int n, char src, char medium, char dest) { if (n == 1) move(src, dest); else { hanoi(n - 1, src, dest, medium); move(src, dest); hanoi(n - 1, medium, src, dest); } } int main() { int m; cout << "Enter the number of diskes :"; cin >> m; cout<<”the steps to moving “<<m<<”diskes:”<<endl; hanoi(m, 'A', 'B', 'C'); return 0; }
学习数据结构时书上便有汉诺塔问题的解析,由分析可知不管该移到哪个盘子,它都可以借助第三根针完成两针之间位置的转化,因此汉诺塔问题就可以通过简单的递归代码求解。