一、函数定义及调用
在C++中,之前以及已经学习到要想程序可以在编程软件上正常运行,必不可少的一个部分是main函数。这是因为每一个C++程序在开始执行时都会去寻找main函数作为接口,找到了main之后再一步步地执行其中的语句。
这种使用方式会导致如果我们需要实现非常复杂的功能,都写在main函数中,main函数的体量会变得非常庞大,而且一旦出错修改起来也会牵一发而动全身,总之很不方便。那有没有一种办法,可以把很多工作做在main函数之外?让主函数保持简洁易读性。比如我要对两个数字进行交换,在main函数中我需要这样写
int main(){
int a=10;
int b=20;
int temp=a;
a=b;
b=temp;
}
看起来并不麻烦,那我如果不但想交换ab,我还想交换cd,交换ef。那这样的代码就要在主函数中重复很多次,所以想到一个办法就是我写一个函数命名为“交换两个数的值”,每次我想交换这两个数时直接调用这个函数就可以更加便捷。
函数定义语法如下:
函数类型 函数名(参数列){
函数主体
return 表达式
}
上述交换两个值的诉求用到函数封装调用的成果如下:
#include<iostream>
using namespace std;
int swap(int num1,int num2) {//定义一个名字叫做swap的函数,它的功能就是交换两个数的值
int temp = num1;
num1 = num2;
num2 = temp; //把交换功能的具体语句给这个函数去执行
cout << "num1="<<num1<< " "<<"num2="<<num2 << endl;
return num1, num2;
}
int main() {
int a = 6;
int b = 4;
swap(a, b); /*调用swap函数,可以理解为swap函数是主干道上的一个小房间,进入这个房间的要求是需要两个int类型的人,从主干道上派出a,b两个int人带着他们的原材料(6和4)进入这个小房间进行加工。最后把加工后的结果再推回主干道,就是swap中return的作用*/
cout<<"a="<<a<<"b="<<b;
system("pause");
return 0;
}
运行结果如下:
可以看到在主函数中即使进行了swap交换,但是ab的值并没有改变,而在swap函数中ab的值确实被互换了,这是因为在值传递中,形参不会影响实参。我个人的理解是虽然进入了主干道的小房间,在小房间中也确实发生了变化,但是当出了那个小房间,变化就消失了。
二、函数的声明
上面说的复杂的算法可以被拆分为很多块,但是观察发现主函数很多时候是写在最后,那么能不能把主函数写在前面,被调用的函数写在后面呢,直接这样写是不行的。就要用到函数声明,声明的含义就是在一开始就告诉编译器我有一个名为xxx的函数,但是写在主函数下面,你在主函数中遇到它不要急着报错去下面找一找。
函数声明的格式为:函数类型 函数名 (参数列)
就是具体函数中的那个第一行比如swap函数中的int swap(int num1,int num2)
问题:
1.什么时候函数类型该写int什么时候该写void?
答:当函数需要返回值而且,返回值类型为int时写作int,当不需要返回值时写作void
2.所谓参数列,需要写哪些,什么时候可以不用写?
当需要传递参数时写参数列,比如swap函数,交换两数的值,需要把待交换的参数传递进来,则在函数名swap后写(int num1,int num2).而且是需要几个就传递几个,比如在swap函数中temp也是一个int型变量,就不需要写在参数列中,因为交换两个数的值这个操作并不需要知道temp
3.什么时候写return,什么时候可以不用写?
当需要返回值时就要写,不需要返回值时可以不写