C++缺省参数和函数重载

缺省参数

缺省参数感念
缺省参数是声明或定义函数时为函数的参数指定一个默认值。在调用该函数时,如果没有指定实参则采用该默认值,否则使用指定的实参比如

#include<iostream>
using namespace std;
void out(int a = 2)//定义函数时指定参数a的默认值为2
{
	cout<<a<<endl;
}
int main()
{
	out();//调用函数时未传如参数,则输入默认值2
	out(10);//传参,则使用传入的参数,输出值为10
}

如果定义的函数中的变量都赋有默认值,则称为全缺省

void fun(int a = 10,int b = 20, int c = 30)
{
	cout << a << b << c << endl;
}

如果定义的函数中部分变量有默认值则称为半缺省

void fun(int a;int b = 10, int c = 20)
{
	cout << a << b << c << endl;
}

需注意半缺省参数必须从右向左一次连续赋值,中间不能有间隔。缺省值只能出现在声明或者定义的地方,不能同时出现

//声明
void fun(int a, int b, int c);
//定义
void fun(int a = 100, int b = 200, int c = 300)
{
	cout << a << b << c << endl;
}

函数重载

我们知道,在C语言中,定义函数的时候,函数名不能相同,否则就会编译报错。但是在C++中,支持函数名相同的函数, 因此也引入了函数重载这个概念
函数重载: 函数名相同,参数不同, 且在同一个作用域, C++支持,C不支持比如

int add(int a,int b)//1
{
	return a + b;
}
int add(double a,double b)//2
{
	return a + b;
}
int add(int a,int b.,int,c)//3
{
	return a + b + c;
}
int add(int a,char b)//4
{
	return a + b;
}
int add(char a,int b)//5
{
	return a + b;
}

第一个函数和第二个函数是参数类型不同构成的重载,第一个函数和第三个函数虽然参数类型相同,但是参数个数不同,也构成了重载,第五个函数和第六个函数是因为参数类型顺序的不同从而构成重载
所以我们能总结出构成重载的条件分别为参数类型,参数个数和参数顺序
那么为什么C和C++对于相同函数名的函数编译不同呢?
我们知道在C/C++中,一个程序要运行起来,需要经历以下几个阶段:预处理、编译、汇编、链接
当函数编译过后,需要链接器进行链接,比如你在此时链接器发现你在调用add函数,但是add没有地址,于是链接器就会到对应的.o文件中找到这个函数,那么C和C++对函数名称的修饰是不同的。
C编译器中,对函数名的修饰中不带有参数的信息,即使你的参数不同,只要函数名相同,那么底层对函数名的修饰就是相同的,链接器发现多个相同的函数修饰名,这可犯了选择困难症,也就会出错
C++编译器中,对函数名的修饰中,除了函数名的信息外还包含参数的信息,也正因此,即使函数名相同,但后面还有参数的信息,链接器在寻找时就会找到对应的函数,也就能成功执行

通过这里的讲解我们就理解了C语言没办法支持重载,因为同名函数没办法区分。而C++是通过函数修饰规则来区 分,只要参数不同,修饰出来的名字就不一样,就支持了重载。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章