C++扩展 函数

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:指定函数体
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值