1.函数的分文件编写:
可以将函数定义在头文件(后缀为.h)中,然后进行文件包含(参见 C语言细节.预处理器.三 部分)或编译多源码文件(参见 C语言细节.多源码文件程序
的编译,命令行参数,退出程序 部分)
2.函数的默认参数
(1)语法:
<type> <func>([<type1> <param1>,<type2> <param2>...<typei> <parami>=<val1>...]) {
<command1>;
...
[return <re>]
}
//注意:有默认值的参数必须放在最后(其右侧不能有没有默认值的参数)
//参数说明:其他参数同 C语言基础.函数.二.1 部分
val:指定相应参数的默认值
//实例:
#include <iostream>
using namespace std;
int f(int i2, int i1 = 1) {
return i1 * i2;
}
int main() {
int i = 101;
i = f(i);
printf("%d\n", i);//结果:101
i = f(i, 2);
printf("%d", i);//结果:202
return 0;
}
(2)函数声明与默认参数:
不能同时在函数声明和函数定义中指定默认参数,即使2次指定的是相同的值:
#include <iostream>
using namespace std;
int f(int i1, int i2 = 1);
int main() {
int i = 101;
i = f(i);
printf("%d ", i);
i = f(i, 2);
printf("%d", i);
return 0;
}
int f(int i1, int i2/* = 1*/) {
return i1 * i2;
}
//报错:
//[Error] default argument given for parameter 2 of 'int f(int, int)' [-fpermissive]
//结果:
101 202
3.函数的占位参数
(1)函数的占位参数:
定义函数时如果只指定了某形参的数据类型,而没有指定其变量名,就指定了1个占位参数:
<type> <func>([<type1>...]) {
...
}
//注意:在调用函数时,也需要给占位参数传值
//实例:
#include <iostream>
using namespace std;
void f(int i1, int) {
printf("This is a function");
}
int main() {
int i = 101;
//f(i);
f(i, 10);
return 0;
}
//报错:
//[Error] too few arguments to function 'void f(int, int)'
//结果:
This is a function
(2)占位参数的默认参数:
<type> <func>([<type1>=<val>...]) {
...
}
//实例:
#include <iostream>
using namespace std;
void f(int i1, int = 10) {
printf("This is a function");
}
int main() {
int i = 101;
f(i);
return 0;
}
//结果:
This is a function
4.函数重载
(1)用法:
C++支持"函数重载",即在1个作用域中定义多个同名函数.这些函数满足下述要求:
①在同1个作用域内
②函数名相同
③参数必须不同
区别可以是参数的数据类型/参数的个数不同/不同类型间的顺序
不能仅有形参名的区别
④函数体/返回值的数据类型可以不同,也可以相同,不能作为重载条件
调用时将根据传入的参数决定究竟调用哪个函数;或者说,函数参数是"重载条件"
//实例:
#include <iostream>
using namespace std;
void f(int i) {
printf("int\n");
}
void f(float i) {
printf("float\n");
}
int f(double i) {
printf("double\n");
return 0;
}
//void f(int i, int j) {
// printf("int,int");
//}
//
//void f(int j, int i) {
// printf("int,int");
//}
int main() {
f(1);
f(1.11f);
int i = f(2.22);
printf("%d", i);
return 0;
}
//报错:
//[Error] redefinition of 'void f(int, int)'
//结果:
int
float
double
0
(2)引用作为重载条件:
只有在引用作为参数时,const等类型限定符才能作为重载条件:
#include <iostream>
using namespace std;
void f(const int& i) {
printf("const int\n");
}
void f(int& i) {
printf("int\n");
}
int main() {
int a = 1;
f(a);
const int b = 2;
f(b);
f(10);
return 0;
}
//结果:
int
const int
const int
(3)函数重载与默认参数:
当函数有默认参数时,函数重载在调用时可能出现二义性:
#include <iostream>
using namespace std;
void f(int i, int j = 1) {
printf("int i,int j");
}
void f(int i) {
printf("int i");
}
int main() {
//f(1);
printf("end");
return 0;
}
//报错:
//[Error] call of overloaded 'f(int)' is ambiguous
//结果:
end
5.匿名函数:
参见:https://www.runoob.com/cplusplus/cpp-functions.html
C++11提供了对匿名函数的支持,称为"Lambda函数"或"Lambda表达式".lambda表达式可以被像对象一样使用,如被赋给变量;也可以被像函数一样
求值.具体形式如下:
[<capture>](<type1> <param1>...)-><rtype>{<body>}
//参数说明:
capture:
type,param:分别指定参数的数据类型和参数名
rtype:指定返回值的数据类型
body:指定函数体