1.缺省参数
// 缺省参数
void Func(int a = 0)
{
cout << a << endl;
}
int main()
{
Func(1);
Func();
return 0;
}
//全缺省
void Func(int a = 10, int b = 20, int c = 30)
{
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl << endl;
}
int main()
{
Func();
Func(1);
Func(1,2);
Func(1, 2, 3);
return 0;
}
//半缺省 部分缺省参数
void Func(int a, int b = 20, int c = 30) //可以任意个缺省参数,但必须从右往左连续缺省
{
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl << endl;
}
int main()
{
Func(1);
Func(1,2);
Func(1, 2,3); //未缺省参数必须赋值
return 0;
}
//若函数定义和声明不在一个文件,则缺省参数不能在声明和定义中同时出现,推荐在头文件中使用缺省参数(如下)
void Func(int a = 1);
void Func(int a)
{
cout << a << endl;
}
2.函数重载:C++允许在同一作用域中声明几个同名函数,这些函数的形参列表不同(形参个数,类型,顺序),常用来处理功能类似数据类型不同的问题
1. 形参个数不同 void Func() { cout << "void Func()" << endl; } void Func(int a) { cout << "void Func(int a)" << endl << endl; } 2.形参类型不同 void Func(int a, int b) { cout << "void Func(int a, int b)" << endl; } void Func(double a, double b) { cout << "void Func(double a, double b)" << endl << endl; } 3.形参顺序不同 (存在相同位置形参类型不同) void Func(int a, char b) { cout << "void Func(int a, char b)" << endl; } void Func(char a, int b) { cout << "void Func(char a, int b)" << endl << endl; } int main() { Func(); Func(1); Func(1, 2); Func(1.1, 2.2); Func(1, 'a'); Func('a', 1); return 0; }
1.缺省值不同,不构成重载 void f(int a) { cout << "void f(int a)" << endl; } void f(int a = 1) { cout << "void f(int a = 1)" << endl; } int main() { //ERROR!!! f(1); f(); return 0; } 2.一个无参数,另一个有一个缺省参数,两函数构成重载,但调用会存在二义性 void f() { cout << "void f()" << endl; } void f(int a = 0) { cout << "void f(int a=0)" << endl; } int main() { f(1); f(); ERROR!!! return 0; }
函数重载原理
以Linux环境下函数名修饰为例,g++的函数修饰后变成【_Z+函数长度+函数名+类 型首字母】
如函数 void f(int a,int b) 经过函数修饰后变成 _Z1fii
void func(int a,double b,char*c)经过修饰后变成 _Z4funcidPi
而gcc的函数修饰后名字不变,故这也是C语言不支持函数重载的原因
实际我们的项目通常是由多个头文件和多个源文件构成,而通过我们C语言阶段学习的编译链接,我们可以知道,【当前a.cpp中调用了b.cpp中定义的Add函数时】,编译后链接前,a.o的目标文件中没有 Add的函数地址,因为Add是在b.cpp中定义的,所以Add的地址在b.o中。那么怎么办呢?所以链接阶段就是专门处理这种问题,链接器看到a.o调用Add,但是没有Add的地址,就会到b.o的符号表中找Add的地址,然后链接到一起。