函数章节

Posted jianw1024

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了函数章节相关的知识,希望对你有一定的参考价值。

1.      为什么要用函数

首先了解一下函数:在面向对象程序设计中,函数是面对对象设计中对功能的抽象

函数的作用:

1)方便调用,提高开发效率

2)降低程序复杂度,简洁明了,便于理解程序结构

同样编写一个两整数相加的程序,可以这样(如下)

 1 //a+b不用函数
 2 #include<iostream>
 3 using namespace std;
 4 int main()
 5 {
 6     int a, b;
 7     cin >> a >> b;
 8     cout << a + b;
 9     return 0;
10 }

也可以这样(如下)

 1 #include<iostream>
 2 using namespace std;
 3 int add1()
 4 {
 5     int a,b,c;
 6     cin >> a >> b;
 7     c =a + b;
 8     cout << c;
 9     return c;
10 }
11 int main()
12 {
13     add1();
14     return 0;
15 }

但是对于代码稍长的程序(如图),在不使用函数的情况下根本不知所云

技术图片

 

2.  为什么要用函数重载

(1)避免同名函数混淆

(2)不用为了对不同参数类型或参数个数而写多个函数,提高程序设计的效率

(3)使程序的结构更清楚,可以用多种实现去实现统一接口,更符合人类习惯

 1 #include <iostream>
 2 
 3 using namespace std;
 4 
 5 void f(){    
 6 cout<<"first"<<endl;
 7 }
 8 
 9 void f(int x){    
10 cout<<"second"<<endl;
11 }
12 
13 void f(int x,int y){
14     cout<<"third"<<endl;
15 } 
16 
17 void f(double x){
18     cout<<"double"<<endl;
19 }
20 
21 int main(){
22     f();
23     f(1);
24     f(1,2);
25     f(1.4);    
26         return 0;
27 }

根据参数的不同来调用不同的同名函数

3.什么是值传递

值传递是指在调用函数时将实参复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实参

通俗来讲就是传递值只在接收的函数内变化,而不会影响到原函数内参数的值

 1 #include<iostream>
 2 using namespace std;
 3 
 4 void swap1(int a, int b)
 5 {
 6     int t;
 7     t = a;
 8     a = b;
 9     b = t;
10 }
11 
12 int main()
13 {
14     int a, b;
15     cin >> a >> b;
16     swap1(a, b);
17     cout << a << b;
18     return 0;
19 }

可以预见,由于值传递的特性,该程序输出的a,b值并不会改变

4.什么是地址传递

地址传递是指将实参的地址传给函数,因此可以在函数内修改实参的值

我们把上面的代码再修改一遍

 1 #include<iostream>
 2 using namespace std;
 3 
 4 void swap1(int &a, int& b)//修改行
 5 {
 6     int t;
 7     t = a;
 8     a = b;
 9     b = t;
10 }
11 
12 int main()
13 {
14     int a, b;
15     cin >> a >> b;
16     swap1(a, b);
17     cout << a << b;
18     return 0;
19 }

现在程序可以输出交换后的结果

5.递归函数

递归函数的一个重要特征是直接或间接调用函数本身,但是对于一般人的思维是较难理解的,我们先暂时记住这一特征

另外,课堂上老师讲的河内塔的递归实现方式,即是先从n开始,再对n-1执行操作,让我们不免联想到数学归纳法

那么我们不妨假设:

      1. 当n=0, 1的时候, 结果正确.
      2. 假设函数对于n是正确的, 函数对n-1结果也正确.
      如果这两点是成立的,我们知道这个函数对于所有的n都是正确的

 这样就可以一定程度上避开迭代的思维。

以斐波那契数列为例,我们可以这样写出递归函数:

 1 int F(int n)
 2 {
 3     if(n==1||n==2)
 4     {
 5         return 1;
 6     }
 7     else
 8     {
 9         return Fibon(n-1)+Fibon(n-2);
10     }
11 }

if……else……语句即是利用了1、2假设的结论

以上是关于函数章节的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段8——声明函数

c++ 函数章节总结

使用从循环内的代码片段中提取的函数避免代码冗余/计算开销

在 Visual Studio 中创建构造函数的代码片段或快捷方式

调用模板化成员函数:帮助我理解另一个 *** 帖子中的代码片段

web代码片段