一、函数的声明与调用
类型标识符 函数名 (形式参数表)
{
语句序列
}
- 函数的类型指的是函数的返回值。
- 函数可以嵌套调用,但不可以嵌套定义。
- 函数直接或间接调用自身。
二、函数间的参数传递
-
只有函数被调用时形参才起作用。
(在函数被调用时才分配形参的存储单元) -
实参类型必须与形参相符。
(这里的“相符”不是指完全一样,可以顺利转化就可以。例如double转化为int,就是砍掉小数点。) -
传递时是传递参数值,即单向传递。
(只有当用引用作为形参时候,形参的改变才会影响到实参的改变。) -
声明一个引用时,必须同时对它进行初始化,使它指向一个已存在的对象。一旦一个引用被初始化,就能改为指向其他对象。
int i,j;
int &ri=i;//建立一个int型的引用ri,并将其初始化为变量i的一个别名
j=10;
ri=j;//相当于i=j;
- 引用可以作为函数的形参(因为函数只有在被调用时形参才起作用)。不会构成函数重载。
#include "stdafx.h"
#include <windows.h>
#include <iostream>
//#include "iostream.h" 从当前目录开始查找
//#include <iostream.h>
//搜索路径的区别
using namespace std;
int swap(int &, int &);//这边的声明函数原型也可以是int Add(int a, int b);或者int Add(int c, int d);或者int Add(int, int);因为这边的形参还不起作用。
//只有当函数被调用的时候形参才起作用。
//函数声明和函数实现不一致时候,会出现:无法解析的外部符号 "int __cdecl swap(int,int)" (?swap@@YAHHH@Z),该符号在函数 _main 中被引用
int Add(int w, int x = 8, int y = 10, int z = 6) //有默认形参值的放在右边,没有默认形参值的放在左边.
{
return 0;
}
int main()
{
int x = 5, y = 7;
swap(x, y);
Add(9);
cout<<"X="<<x<<"Y="<<y<<endl;
return 0;
}
int swap(int &a, int &b)
{
int c = a ;
a = b;
b = c;
return c;
}
三、内联函数
- 声明时使用关键字inline
- 编译时在调用处用函数体进行替换, 节省了参数传递、控制转移等开销。
- 内联函数体内不能含有循环语句和switch语句。
- 对内联函数不能进行异常接口声明。(Try、Catch)
四、带默认形参值的函数
函数在声明的时候可以预先给出默认的形参值,调用时如给出实参,则采用实参值,否则采用预先给出的默认形参值。
- 有默认形参值的要放在右边,没有默认形参值的要放在左边。
int add(int x,int y=5,int z=6);//正确
int add(int x=1,int y=5,int z);//错误
int add(int x=1,int y,int z=6);//错误
- 调用出现在函数体实现之前,默认形参值必须在函数原型中给出。 而当调用出现在函数体实现之后时,默认形参值需在函数实现时给出。
- 在相同作用域内,默认形参值的说明应该保持唯一。 但如果在不同的作用域中,允许说明不同的默认形参。
例如:
int add(int x=1,int y=2);
int z=10;
void main(void)
{
int z=5;
int add(int x=3,int y=4);
add();//使用局部默认形参值(实现3+4)
}
void fun(void)
{...
add();//使用全局默认形参值(实现1+2)
}
五、函数重载
- C++允许功能相近的函数在相同的作用域内以相同的函数名声明,从而形成重载。方便使用,便于记忆。
- 函数重载的形式:形参类型不同或者形参个数不同。
- 返回值是在函数执行之后才有的,但是在编译阶段还没有返回值,所以不以返回值来区分。(也就是说不以函数类型来判断函数是否重载)
六、C++系统函数
- C++的系统库中提供了几百个函数可供程序员使用。
- 使用系统函数时要包含相应的头文件。
- 查找编译系统的库函数手册。
七、补充:函数指针与指针函数
- 函数指针(函数类型的指针)
指向函数代码首地址的指针变量成为函数指针。
int (*f)(int x);
double (*ptr)(double x);
- 指针函数(指针类型的函数)
函数的返回值是指针类型数据。
(int*) f(x,y);
- 函数指针赋值
int func(int x);//声明一个函数
int (*f)(int x);//声明一个函数指针
f=func;//将func函数的首地址赋给指针f
- 举例
//请定义一种函数指针类型
//返回值为整形指针,形参为两个整数
Typedef int (*pfun) (int,int);
*pfun pf;