函数的基本概念
// 函数的返回值
- 不能返回局部变量地址值
- 可以返回指向数组或函数的指针,但不能返回数组类型或指针类型
- auto func(int x)->int(*)[10];函数的定义都可用尾置类型返回指向数组的指针
// 函数的退出
- return
- 退出当前函数的调用,并将返回值返回给调用者
- 调用时,进行stack unwinding,调用局部对象析构函数,清理局部对象
- 如果在main中,则之后交由系统调用exit
- return EXIT_SUCESS:底层调用_exit函数,做退出动作
- exit
- 调用时,会做大部分清理工作,但不会销毁局部对象
- 进行的销毁工作:
- 销毁所有static和global对象
- 清空所有缓冲区
- 关闭所有`I/O`通道
- _exit
- 调用之后立即进入内核
- abort
- 不进行任何清理工作,直接终止程序
// 函数的默认参数
- C++可以在函数声明时提供一个默认参数
- 当函数调用时没有指定该参数,编译器会自动调用默认参数值代替实参
- 声明和定义时时,只有一个位置有默认参数
// 函数的占位参数
- C++可以为函数提供占位参数
- 占位参数只声明参数类型,没有具体形参名称
- 占位参数可以为以后程序扩展留下线索,并兼容C中出现的不规范写法
// 函数形参分类
- 传值:函数调用期间,实参将自己的值拷贝一份给形参
- 传址:函数调用期间,实参将地址值拷贝一份传给形参
- 引用:
// 可能的函数形参类型
- 数组作参数形参,传递的不是整个数组,而是数组的首地址
- 结构体作函数形参,可传址,传址,引用
// 函数的副本机制
- 函数的返回值有副本机制:
- 结构体数组没有副本机制
- 若结构体内部存在数组,该对象也有副本机制
函数指针
// 函数指针定义
- void (*p)(int,int); // 定义函数指针p,它指向此类型函数:void fun(int,int)
- p = fun; // 令函数指针指向func函数
- typedef void(*FP)(int,int); // 定义函数指针类型FP
- typedef void(F)(int,int); // 定义一个函数类型F
// 函数的调用
- 通过函数名调用
- 通过函数地址调用,即函数指针调用
// 函数的地址
- 函数名会被解析为函数地址
- 将函数名赋值给函数指针,就相当于让该指针指向该函数
-函数重载其实是几个不同的地址,即不同的函数
// 函数指针
- 其指向:系统为函数分配一段内存地址空间,函数指针就指向这块空间首地址
- 想通过函数指针实现函数重载是不可能是,因为函数指针已经固定指向了某个地址