目录
- 一、缺省参数
- 1.1缺省参数的定义
- 1.2缺省参数的分类
- 1.3缺省参数使用时的注意事项
- 二、函数重载
- 2.1函数重载的概念
- 2.2为什么要有函数重载
- 2.3 C++支持函数重载的原理
一、缺省参数
1.1缺省参数的定义
缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参。比如:
缺省参数给人的感觉就好像时备胎一样。如果正主传过来了,那么他就没什么意义;如果正主没有过来,那么他就有存在的意义了。
C++里面花费了很大的力气引入缺省参数,肯定是有很大的意义的。
其意义在于提高程序的可扩充性。比如某个以及写好的函数需要添加新的参数,而原先调用函数的的那些语句未必需要新增加的参数,为了避免对原来所有调用该函数的地方进行修改,就可以使用函数缺省参数了。比如:
1.2缺省参数的分类
- 全缺省参数
- 半缺省参数
1.3缺省参数使用时的注意事项
- 半省参数必须从左往右依次来给出,不可以间隔着给。比如:
- 缺省参数不能在函数声明和定义中同时出现。比如:
Add.h文件
Add.cpp文件
test测试文件
而改过来后就可以编译通过。比如:
Add.h文件
Add.cpp文件
test测试文件
- . 缺省值必须是常量或者全局变量
二、函数重载
2.1函数重载的概念
**函数重载:**是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同,常用来处理实现功能类似数据类型不同的问题。函数重载C本身不具有这个概念。为什么不具有下面我会尽量解释清楚。
比如:
#include<iostream>
using namespace std;
// 1、参数类型不同
void func1(int left, int right)
{
cout << "int func1(int left, int right)" << endl;
}
void func1(double left, double right)
{
cout << "double func1(double left, double right)" << endl;
}
// 2、参数个数不同
void func2()
{
cout << "func2()" << endl;
}
void func2(int a)
{
cout << "func2(int a)" << endl;
}
// 3、参数类型顺序不同
void func3(int a, char b)
{
cout << "func3(int a,char b)" << endl;
}
void func3(char b, int a)
{
cout << "func3(char b, int a)" << endl;
}
int main()
{
func1(10, 10);
func1(10.0, 10.0);
func2();
func2(10);
func3(10, 'A');
func3('A', 10);
return 0;
}
2.2为什么要有函数重载
我们都知道C++是由C延申过来的,所有C语言不具有的函数重载对于语言来说肯定是意义非凡。那么它具体有哪些作用呢?
- 函数书写方便。比如要写加法函数。第一写整形加法函数,第二个写浮点型加法函数,那么这些函数的函数名都可以是Add,只需要改参数类型即可,不需要用别的函数名加以区分。
- 类的构造函数也是重载函数。构造函数是同名的成员函数,它一般被划分为:有参构造、无参构造、拷贝构造,它们构成函数重载。
- 模板也是利用的函数重载
2.3 C++支持函数重载的原理
C++支持函数重载的原理涉及的知识点挺多的,在这个就不完全展开细说。等哪天我完全懂的这方面的知识,我再来这里把这个坑给填上。
我们都知道生成一个可执行程序需要:预处理、编译、汇编、链接这几个阶段。
预处理的作用:头文件展开、去注释、条件编译、宏替换(在linux平台下,去注释先于宏替换)
编译的作用:先进行语法检查,然后将高级语言写的代码转化为汇编指令
汇编的作用:指将汇编指令转为二进制代码
链接的作用:并不是简单的将多文件合并,主要进行的是文件之间的交互
这里拿func.c、func.h、test.c来举例。
func.h主要在func.c和test.c中展开。
func.c在编译之后,链接之前,会生成一个符号表,符号表的主要作用是映射函数名和函数地址,简单来说就是存储函数名和对应的函数地址,然后Test.c就以调用的函数名去取符号表中的函数名对应的地址,完成func.c和test.c的交互。
有了这个知识点就可以粗略的解释为什么C++支持函数重载,C不支持函数重载。
其原因是:因为C语言的函数名修饰规则与函数参数无关,或者说没有修饰规则。
而C++在编译期间,会将函数名修饰一下,即将函数名与参数联系在一起。
(以上的函数名变化参考至linux平台,具体函数名修饰规则不同平台不一样)
上图同样可以解释为什么返回值不构成函数重载,因为c++的函数名修饰规则不考虑返回值,只将函数名与参数结合起来组成新的函数名。