一、缺省参数
1.概念
缺省参数是声明或定义函数时为函数的参数指定一个默认值;在调用该函数时,如果没有指定实参则采用该默认值,否则使用指定的实参。
2.分类
(1)全缺省参数
void FunTest(int a = 1, int b = 2, int c = 3)
{
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl;
}
(2)半缺省参数
void FunTest(int a, int b, int c = 3)
{
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl;
}
3. 注意
(1)半缺省参数必须从右往左依次来给出,不能间隔给,下面的代码就是错误的
void FunTest(int a = 1, int b, int c = 3)
{
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl;
}
(2)缺省参数不能在函数声明和定义中同时出现,下面的代码就是错误的
void FunTest(int a = 1, int b, int c = 3);
void FunTest(int a = 1, int b, int c = 3)
{
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl;
}
(3)缺省值必须是常量或者全局变量
(4)把后缀名改为.c,将会编译错误
二、函数重载
1. 概念
函数重载是函数的一种特殊情况,是指在同一作用域内,不同参数列表的函数,这组函数被称为重载函数,可以有一组具有相同函数名,常用来命名一组功能相似的函数,处理实现功能类似数据类型不同的问题,避免了名字空间的污染,对于程序的可读性有很大的好处。
2. 条件
(1)名字必须相同
(2)参数列表一定不同(参数个数不同;参数类型不同;类型的次序)
(3)返回值类型是否相同没有关系
3. 几个问题
(1)extern “C”有什么作用?
在C++工程中在函数前加extern "C",就是将该函数按照C语言来编译
extern "C" int Add(int left, int right)
{
return left + right;
}
(2)C语言中为什么不能支持函数重载?
在vs编译器中,编译.c文件时,只会给函数名之前加上”_”;,所以加入两个函数名相同的函数在编译之后的函数名也照样相同,编译器调用时会因为不知道到底调用哪个而报错
(3) C++中函数重载底层是怎么处理的?
在vs编译器中,编译.cpp文件时,虽然两个函数的函数名一样,但是他们在符号表中生成的名称不一样,例如
int Add(int left, int right)
{
return left + right;
}
(?Add@@YAHHH@Z)
‘?’表示名称开始,‘?’后边是函数名,“@@YA”表示参数表开始,后边的3个字符HHH分别表示返回值类型,两个参数类型;“@Z”表示名称结束; 由于两个函数生成的符号表中的名称不一样,所以是可以编译通过的