为什么要使用函数

  • 使用函数可以将一个比较复杂的程序系统的分为若干块简洁的模块,使程序更加清晰明了

    比如,我们想要模拟一个栈,我们的入栈,出栈,判空等操作可以封装在push(),pop(),empty()中,可以更加清晰明了的了解到每一步的操作,易于理解程序。
  • 函数可以将一个重复出现的操作定义为一个模块,通过简单的函数名,简单的参数来调用实现这一功能,使结构化的程序设计更加便捷,易于实现

//例如对于我们的程序需要n多次快速排序的操作,我们不需要写n次排序算法,而只是需要编写一次排序算法并将其封装为函数,通过调用函数进行n次排序
void QuickSort(int a[],int l,int r)
{
int i,j,p;
p = a[l];
i = l,j = r;
while(i < j){
while(i < j && a[j] >= p){
j--;
}
if(i != j){
a[i] = a[j];
}
else break;
while(i < j && a[i] <= p){
i++;
}
if(i != j){
a[j] = a[i];
}
else break;
}
a[j] = p; if(l < j) QuickSort(a,l,j);
if(j+1 < r)QuickSort(a,j+1,r);
} 当定义好函数时,当我们再次需要执行数组由小到大的排序时,就可以直接调用QuickSort()与三个参数来完成
  • 将一个操作封装为函数,可以增加我们Debug的效率,也可以减少以后修改代码的困难。

为什么要用函数重载

函数重载可以减少程序员在起函数名,记函数名方面的困难。易于调用。

//我们以最简单的add()函数来举例,加入我们只定义一个int整形返回值的函数。那么该函数的作用就十分有限。
int add(const int &a,const int &b) (return a+b);
//但是当我们定义长整型,浮点类型时,函数的使用范围就会大大增加
long long add(const long long &a,const long long &b) (return a+b);
double add(const double &a,const double &b) (return a+b);
//这样我们就可以使用add函数来运算常见的几种基本类型

C++传参方式

C++的传参方式目前有三种,值传递,地址传递与引用传递。

值传递

//值传递的最主要的特点就是:在函数中对形参的操作不会对其对应的实参产生影响。
void func(int x) {x -= 10;} int t = 10;
func(t);
//该函数在函数中对x进行了操作,但形参x的改变并不会改变实参t。

地址传递

//地址传递与值传递存在相同之处,即在函数体中的操作不会改变传入的指针的指向,但会改变指针指向的对象的值。
void set(int *p,const int &x) {*p = x;} int t = 10;
int *p = &t;
int x = 0;
set(p,x);
//该函数运行后,p指针的指向不会发生改变,但是p指针指向的对象t的值被赋值为了x。

引用传递

//传引用参数与其他引用一样,可以想象为重新给了实参一个名字,其与实参共用同一地址。
void set(int &p,const int &x){p = x;} int t = 10;
int x = 0;
set(t,x);
//当调用set()函数时,p绑定到对象t上,此时,改变p的值也就是改变t的值,因此,此时t的值为0。 //引用传递的另一个重要的用法是,返回额外信息,我们知道每个函数只能存在一个返回值,但是通过引用传递,可以在函数外定义一个实参来接收返回值,在函数内将其传递给对应形参。
//例如在模拟队列的pop()操作中,可以存储一个形参e接收被pop的值。
void pop(/*其他参数.. ,*/ int &e){
e = que.front();//队列队头元素
que.pop(); //队列的Pop操作
}

特殊的函数——递归函数

我们知道一个函数可以被其他函数来调用,而其他函数也可以包括它自己,这种函数,就是递归函数。

递归操作可以节省我们的代码长度,但随之而来的是不易理解等的弊端。

//比如经典的递归函数求Fibonacci数列的第n项
int fib(int n)
{
if(n <= 2) return 1;
return fib(n-1) + fib(n-2);
}
//优点固然可喜,但缺点也很严重,比如递归层数有限,又如对空间时间的浪费。
//所以,当我们想要使用递归函数时,要事先思考其递归层数防止栈溢出,思考它在时间空间上是否浪费过大等。

最新文章

  1. PE Checksum Algorithm的较简实现
  2. String、StringBuffer与StringBuilder之间区别
  3. UVALive 6916---Punching Robot(卢卡斯+容斥)
  4. 【Effective Java】10、java注解使用
  5. Win7下VS2010使用“ASP.Net 3.5 Claims-aware Template”创建ClaimsAwareWebSite报&quot;HRESULT: 0x80041FEB&quot;错误的解决办法
  6. css中textarea去掉边框和选中后的蓝色边框问题的解决方法
  7. PHP组合模式
  8. 【redis】04set类型和zset类型
  9. ASP终极防下载(转)
  10. OpenStack G版以后的Availability Zone与Aggregate Hosts
  11. Android客户端实现七牛云存储文件上传
  12. Paper.js - Paper.js
  13. 模式识别 - 处理多个演示样本研究(MIL)特点(matlab)
  14. Shine we together: A innovative dating site using 2012 Nobel Laureate Roth&#39;s algorithm
  15. Jquery插件之ajaxForm ajaxSubmit的理解用法
  16. 设计模式之桥接模式(Bridge模式)
  17. Python编程中出现ImportError: bad magic number in &#39;numpy&#39;: b&#39;\x03\xf3\r\n&#39;
  18. mySql的UDF是什么
  19. Linux 文件日志筛选操作
  20. Python实例---爬去酷狗音乐

热门文章

  1. iOS之CGPath相关属性(一)
  2. Django之模板语言(四) ------&gt;Tags
  3. Oracle的UTL_FILE.FOPEN学习笔记
  4. 深度学习(二十六)Network In Network学习笔记
  5. Android 开发 Camera2开发_3_处理预览和拍照偏暗问题
  6. 主从复制系列A
  7. Trie树 模板
  8. SQL有意思的面试题
  9. sqoop的数据抽取过程记录
  10. 关于mapreduce 开发环境部署和jar包拷贝问题