CPP复习笔记-第3章-函数

现在我们来复习第3章——函数。

函数原型

函数需要在主函数前声明。函数原型可以不需要参数名。以下三种函数原型等价:

1
2
3
double max(double,double);
double max(double x,double y);
double max(double a,double b);

没那么熟悉的常用数学函数原型

1
2
3
4
double exp(double x);  
double fmod(double x,double y);
double log(double x);
double log10(double x);

函数参数的传递

有三种方式:传值调用、指针调用、引用调用。

实参传值的副作用

避免add(++x,x+y)之类的写法,因为不同编译器对实参求值的顺序可能不同。

默认参数

  1. 默认参数必须是参数表中最右边的。例如double dist(double,double,double = 0,double = 1);.
  2. 默认参数要且仅要在函数名第一次出现时指定。
  3. 默认值可以是常量、全局变量或函数调用,但不能是局部变量。
  4. 默认参数可用于内联函数。

指针调用和引用调用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include<iostream>
void pswap(int *x,int *y){ //用指针
int tmp=*x;
*x=*y,*y=tmp;
return ;
}
void rswap(int &x,int &y){ //用引用
int tmp=x;
x=y,y=tmp;
return ;
}
int main(){
int a=10,b=20,c=10,d=20;
pswap(&a,&b); //参数是指针,指针指向的是地址,所以要取地址
rswap(c,d); //参数是引用
std::cout<<a<<" "<<b<<" "<<c<<" "<<d<<std::endl;
return 0;
}

注意 只有const引用对应的实参可以是常量或表达式,非约束的引用参数对应的实参必须是对象名。

函数的返回类型

  1. 使用指针函数可以节省匿名对象造成的时空消耗。
  2. 指针函数不能返回局部变量的指针。
  3. 返回引用比返回指针更直接,可读性更好。引用函数不能返回局部变量。

函数调用机制

  1. 嵌套调用
  2. 递归调用

函数地址

对于一个函数原型int func();func&func以及*&func都是函数的入口地址。
以下三种调用都可以达到相同的效果:

1
2
3
func();//名方式调用
(&func)();//地址方式调用
(*&func)();//间址调用

在后两种调用方式中,第一个括号不能省略,因为地址表达式的计算要优先于参数结合。

函数指针

可参阅菜鸟教程:https://www.runoob.com/w3cnote/cpp-func-pointer.html

内联函数

  1. inline关键字要在函数名第一次出现时指定
  2. 内联函数中不能有复杂的流程控制语句,否则内联无效。
  3. 递归函数不能说明为内联函数。

重载函数

函数返回值的类型不起作用

int func(int);double func(double);不是重载函数,编译器会认为函数重复说明;

使用默认参数时可能产生二义性

1
2
int max(int,int);
int max(int,int,int=0);

如有以上函数定义,则在调用max(5,3)时,无法确定调用哪个函数。

本章的其他内容

变量作用域

参考菜鸟教程:https://www.runoob.com/cplusplus/cpp-variable-scope.html
注意这几个标识符:auto register extern static
在块内,当局部变量与全局变量同名时,全局变量被屏蔽。若要访问全局变量,可用作用域运算符::

预处理指令

掌握文件包含、宏定义、条件编译。

更多内容

其他内容详见课本,此处不再赘述。


CPP复习笔记-第3章-函数
https://www.jollyan.top/cpp-fu-xi-bi-ji-di-3-zhang/
作者
梦里徜徉
发布于
2024年12月18日
许可协议