此份笔记建议在完整阅读郑莉老师、董渊老师、何江舟老师所编写的《C++语言程序设计(第4版)》后食用,风味更佳!
最后,由于本人水平有限,笔记中仍存在错误但还没有被检查出来的地方,欢迎大家批评与指正。
第3章 函数
3.1 函数的定义与使用
1.函数定义的语法
类型说明符 函数名(含类型说明的形式参数表)
{
语句序列
}
2.函数的返回值和返回值类型
(1)函数有返回值
return 表达式;
作用:
- 指定函数返回值的类型
- 结束当前函数的执行
(2)函数没有返回值
- 不写 return 语句
- 写一个不带表达式的 return 语句
3.函数的声明与定义
- 声明一个函数只是将函数的有关信息(函数名、参数表、返 回值类荆等)告诉编译器,此时并不产生任何代码;
- 定义一个函数时除了同样要给出函数的有关信息外,主要是要写出函数的代码。
- 声明函数时,形参表只要包含完整的类型信息即可,形参名可以省略。
//函数声明
double getArea(double,double);
//函数定义
double getArea(double l,double w){
...
}
3.2 函数的参数传递
在函数未被调用时,函数的形参并不占有实际的内存空间,也没有实际的值。只有在函数被调用时才为形参分配存储单元,并将实参与形参结合。
函数的参数传递指的就是形参与实参结合(简称形实结合)的过程,形实结合的方式有值传递和引用传递。
1.值传递
- 值传递是指当发生函数调用时,给形参分配内存空间,并用实参来初始化形参(直接将实参的值传递给形参)。
- 这一过程是参数值的单向传递过程,一旦形参获得了值便与实参脱离关系,此后无论形参发生了怎样的改变,都不会影响到实参。
2.引用传递
- 用引用作为形参,在函数调用时发生的参数传递,称为引用传递。
- 引用是一种特殊类型的变量,可以被认为是另一个变量的别名,通过引用名与通过被引用的变量名访问变量的效果是一样的。
- 语法:
数据类型 &引用变量名=变量名;
- 注意
- 声明一个引用时,必须同时对它进行初始化,使它指向一个已存在的对象。
- 一旦一个引用被初始化后,就不能改为指向其他对象。
- 引用作为形参
- 因为形参的初始化不在类型说明时进行,而是在执行主调函数中的调用表达式时.才为形参分配内存空间,同时用实参来初始化形参。
- 所以,引用类型的形参就通过形实结合,成为了实参的一个别名,对形参的任何操作也就会直接作用于实参。
3.指针传递
3.3 带有默认形参值的函数
1.预先给定形参值
- 函数在定义时可以预先声明默认的形参值。
- 调用时如果给出实参,则用实参初始化形参,如果没有给出实参,则采用预先声明的默认形参值。
2.规则
- 有默认值的形参必须在形参列表的最后
- 也就是说,在有默认值的形参右面,不能出现无默认值的形参。
- 这是因为在函数调用中,实参与形参是按从左向右的顺序建立对应关系的。
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); //错误
- 在相同的作用域内,不允许在同一个函数的多个声明中对同一个参数的默认值重复定义 ,即使 前后定义的值相同也不行。
- 函数的定义也属于声明 ,这样,如果一个函数在定义之前又有原型声明 ,默认形参值需要在原型声明中给出,定义中不能再出现默认形参值。
3.4 内联函数
- 内联函数不是在调用时发生控制转移,而是在编译时将函数体嵌入在每一个调用处。
- 语法
inline 类型说明符 函数名(含类型说明的形式参数表)
{
语句序列
}
- inline 关键字只是表示一个要求,编译器并不承诺将 inline 修饰的函数作为内联。
3.5 函数重载
1.什么是函数重载
两个以上的函数,具有相同的函数名,但是形参的个数或者类型不同,编译器根据实参和形参的类型及个数的最佳匹配,自动确定调用哪一个函数,这就是函数的重载。
2.注意
- 重载函数的形参必须不同:个数不同或者类型不同。
- 如果函数名相同,形参类型也相同(无论函数返回值类型是否相同),在编译时会被认为是语法错误(函数重复定义)。
//参数类型不同
int add(int x,int y);
float add(float x,float y);
//参数个数不同
int add(int x,int y);
int add(int x,int y,int z);
- 当使用具有默认形参值的函数重载形式时,需要注意防止二义性。
void fun(int length,int width=2,int height=33);
void fun(int length);
//当以下形式调用函数,编译器无法确定执行哪一个函数
fun(1);