3.1-面向过程
所谓的面向过程是面向的是解决一个问题的具体步骤(具体的操作细节[函数])!
3.2-函数本质
函数就是用来完成一定功能的一段代码,它其实是对完成同一类具体事情的封装和抽象;针对的是同一类事情,但仅仅只是操作的数据不同,当我们不考虑具体的操作数据,发现是在做同一件事情时,抽取出来共有的操作步骤的时,抽象出来的就是函数!
3.3-函数定义
- 声明实现同体
返回值 函数名(参数列表)
{
函数体;
} - 声明实现分离
返回值 函数名(参数列表);//声明
返回值 函数名(参数列表)//实现
{
函数体;
}
3.4-函数调用
函数名(实参列表);//根据是否存在返回值,决定是否接收函数返回的数据!
3.5-函数重载
函数名相同,参数个数不同或者类型不同或者类型不同的参数顺序不同的函数互为重载函数!
函数重载是一种静态多态,是在编译阶段就确定的一种多态实现,自动匹配调用对应的函数!
- 特性:
函数重载跟返回值没有关系!
不可存在歧义!
void f(int a,int b=10) , void f(int a) //当传递一个参数时,无法区分是哪个函数!
3.6-函数指针
函数名的本质就是一个地址,指向了对应函数的代码块!
函数指针看后缀是一个指针,指向了一个地址,只不过这个地址是一个函数!
- 方式1:
typedef 返回值(类型名)(参数类型)
类型名* 指针变量名;
将函数定义成一种类型,然后声明类型的变量; - 方式2:
typedef 返回值(*类型名)(参数类型)
类型名 变量名;
将函数指针定义成一种类型,然后声明类型的变量; - 方式3:
返回值(*变量名)(参数类型)
直接声明一个指向函数的指针变量;
函数重载-指针
当我们声明一个指向一种某种类型的函数指针变量的时候,我们必须给它赋值对应的函数,这时候我们的指针就直接指向这个函数的入口地址,如果这个函数有很多个重载函数,我们编译器会自动匹配与这个指针变量所指向的这个类型的函数相同的那个函数,并将入口地址传递给我们的指针变量
void f(int a,int b) void f(int a,int b,int c)
void(*fp)(int,int) ->编译器会自动将void f(int a,int b)地址赋值给函数指针,同时传递参数时必须传递对应参数!
3.7-调用堆栈
- 栈分布
栈底(高地址),栈顶(低地址) - 寄存器
esp(栈顶指针),ebp(栈底指针),eip(指令指针寄存器)
图解函数调用栈:
#include <stdlib.h>
#include <iostream>
using namespace std;
int Sum(int num1, int num2)
{
int ret = num1 + num2;
return ret;
}
int main(int argc, char* argv[])
{
int ret = Sum(1, 2);
return 0;
}