函数的基本格式
返回值类型 函数名(传入形式参数列表)
{
函数体语句
return 表达式
}
例子:
//加法
int add(int num1, int num2)
{
int sum = num1 + num2;
return sum;
}
返回值类型:程序要返回的值的类型
函数名:函数名称
传入参数列表:传入函数的数据集
函数体语句:在函数内具体执行的内容
return表达式:和前面定义的返回值类型相关,返回相应的数据
重点:
1.值传递:int add(int num1, int num2)中的num1和num2是形参,而主程序中调用该函数时会将实参值传递给形参,存储在其他的内存空间当中,不会影响原本内存空间的值
值传递只传递值,形参发生改变时不会影响实参(即实参不改变)
2.在不传入参数时,函数无法直接调用主程序中的变量
错误案例:主程序中有变量c与d
void direct_swap()
{
int temp = c;
c = d;
d = temp;
}
void swap(int a, int b)
{
cout << "形参改变前:" << a << " " << b << endl;
int temp = a;
a = b;
b = temp;
cout <<"形参改变后:"<<a << " " << b<<endl;
}
//主函数
int c = 3, d = 5;
cout << "实参:" << c << " " << d<<endl;
swap(c, d);
cout << "实参:" << c << " " << d<<endl;
运行结果:
}
特殊情况:不需要返回值时,返回值类型为void
函数的声明
当把函数A写在main函数的后面时,需要在main函数前对函数A进行声明(declaration)
在main函数后所写的真正的函数A被称作定义(definition)
声明可以写多次,定义只能写一次
示例:
//写在主程序前的声明 declaration
int max(int a,int b);
int main()
{
主程序
}
//写在主程序后的函数max 的真正定义 definition
int max(int a, int b)
{
return a > b ? a : b;
}
函数和主程序在不同文件中
当代码量很大的时候,函数会放在不同的文件中
分文件编写的步骤:
1.创建后缀为.h 函数的头文件
2.创建后缀为.cpp 函数的源文件
3.在头文件中include源文件会用到的库,并写函数声明declaration
4.在源文件中include头文件(将头文件和源文件连接),并写函数的定义definition
5.在主文件中引用函数的头文件,然后在主程序中调用函数
示例:后缀为.h的函数的头文件
示例头文件的完整名称是swap.h
#pragma once //用于保证同一个物理意义上的头文件不会被include多次,另一种用法是#ifndef
#include <iostream>//调用函数会用到的库
using namespace std;
void swap(int a, int b);//函数的声明
注意:#pragma once //用于保证同一个物理意义上的头文件不会被include多次,另一种用法是#ifndef
示例:后缀为.cpp的函数的源文件
示例源文件的完整名称是函数swap的源文件.cpp
可见头文件不一定和函数源文件名称相同,两者之间有将两者联系在一起的连接
#include "swap.h"//引用函数的头文件,此处将头文件与源文件连接起来
void swap(int a, int b)
{
cout << "形参改变前:" << a << " " << b << endl;
int temp = a;
a = b;
b = temp;
cout << "形参改变后:" << a << " " << b << endl;
}
示例:后缀为.cpp的主文件
示例主文件名称是:函数分文件编写的主程序.cpp
//#include<iostream>
//using namespace std;
#include "swap.h"
int main()
{
int a = 10, b = 20;
cout << "test the #include<iostream> and using namespace std;"<<endl;
swap(a, b);
}
从主程序可知,以下两条已经包含在swap函数的头文件swap.h内了,如果确定已经存在的话主程序可以不写,如果不确定则可以写出来,prgma once会将多次提及的多余的头文件不被include
#include<iostream>
using namespace std;