缺省参数与函数重载(2)

目录

1、cout与cin

2、缺省参数

3、函数重载


1、cout与cin

<<     流提取运算符

>>     流插入运算符

#include<iostream>
using namespace std;
int main()
{
	int a = 1;
	double b = 1.1;
	//cout与cin会自动识别内置类型
	//不需要像printf与scanf,要指明%d,%lf
	//但是需要格式化输出时,cout不如printf,所以哪个方便用哪个
	cout << "a=" << a << endl << "b=" << b << endl;
	printf("a=%d\nb=%.2lf\n", a, b);
    //scanf与cin都默认以空格或换行去间隔
	cin >> a>>b;
    scanf("%d%.2lf", &a, &b);
	cout << "a=" << a << endl << "b=" << b << endl;
	printf("a=%d\nb=%.2lf\n", a, b);
	return 0;
}

2、缺省参数

缺省参数:声明或定义函数时为函数的参数指定一个缺省值。

调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参。

全缺省:所有参数都给了缺省值。

半缺省:缺省部分参数,必须连续的从右往左缺省。

注意:缺省参数不能声明和定义中同时出现,要么出现在声明,要么出现在定义

#include<iostream>
using namespace std;
void func1(int a=1,int b=2,int c=3)
{
	cout << "a=" << a <<" " << "b=" << b <<" " << "c=" << c << endl;
}
void func2(int a , int b , int c = 3)
{
	cout << "a=" << a << " " << "b=" << b << " " << "c=" << c << endl;
}
void func3(int a, int b=2, int c = 3)
{
	cout << "a=" << a << " " << "b=" << b << " " << "c=" << c << endl;
}
int main()
{
	func1();//没有传参
	func1(10);//传一个
	func1(10,20);//传二个
	func1(10, 20,30);//三个都传
	//半缺省
	func2(10, 20);
	func3(10);
	return 0;
}

3、函数重载

所谓重载,就是一词多义。

C++允许在同一作用域中声明几个类似的同名函数,这些同名函数的形参列表(参数个数、类型、顺序)不同。

#include<iostream>
using namespace std;

//1、类型不同
int Add(int a, int b)
{
	cout << a+b<< endl;
	return a + b;
}
double Add(double a, double b)
{
	cout << a+b << endl;
	return a + b;
}

int main()
{
	Add(1, 2);
	Add(1.1, 2.2);
	return 0;
}
#include<iostream>
using namespace std;
//2、顺序不同
void func(int a, double b)
{
	cout << "func(int a, double b)" << endl;
}
void func(double b, int a)
{
	cout << "func(double b, int a)" << endl;
}
int main()
{
	func(1, 1.1);
	func(1.1, 1);

	return 0;
}
#include<iostream>
using namespace std;
//3、个数不同
void func(int a)
{
	cout << "func(int a)" << endl;
}

void func(int a, int b)
{
	cout << "func(double b, int a)" << endl;
}
int main()
{
	func(1);
	func(1,2);
	return 0;
}

为什么c++支持函数重载,c不支持?

回忆一下编译器的编译过程:func.h、func.c、test.c

1、预处理:头文件展开、宏替换、条件编译、删注释

2、编译:检查语法,生成汇编代码:func,s、test.s

3、汇编:汇编代码转化为二进制的机器码:func.o、test.o

4、链接

在编译阶段,函数调用会转化为call  func( )的指令,圆括号里填的是函数的地址,如果函数定义与调用在同一个文件,则这里会直接填上,如果不在同一个文件,则会在链接时,根据函数名在符号表中寻找。(符号表是生成.o文件后自带的)

因为C直接用函数名去找,因为函数名相同,不知道哪个该对应哪个,而且符号表生成也存在歧义和冲突,所以C不支持函数重载。

C++存在函数名修饰规则,不同的编译器修饰也不相同,有了函数名修饰规则,只要参数不同,符号表与链接用函数名查找时,不会存在歧义和冲突。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值