初识C++ 二
- 上节课输入输出问题的一些补充
- 一. 缺省参数
- 1.1 半缺省参数
- 1.2 全缺省参数
- 二. 函数重载
- 2.1 重载是什么意思?
- 2.2 如何区分重载函数
- 参数类型不同
- 参数个数不同
- 参数顺序不同
- 附加题1
- 附加题2
- 2.3 c++支持函数重载的原理
- 预处理
- 编译
- 汇编
- 连接
- 总结
要以一种很认真的态度去生活
上节课输入输出问题的一些补充
其实printf和cout之间并没有明显的优劣之分
大家根据自己的需要 根据使用的方便程度自行选择就好
一. 缺省参数
我们这里先来看百度上的定义
所谓缺省参数,顾名思义,就是在声明函数的某个参数的时候为之指定一个默认值,在调用该函数的时候如果采用该默认值,你就无须指定该参数。
什么意思捏 好像还是有点不理解 那么我们来上代码
我们写出下面这段代码
void func(int a = 10)
{
cout << "a: " << a << endl;
}
我们再main函数里面运行一下试试看
我们可以发现 咦 好像不使用参数也可以运行!
接下来我们试试看使用参数会有什么效果
接下来看看其他值怎么样
20也是可以的
那么这里我们就可以发现一个规律了
当我们在调用函数的时候不指定值的时候它就会使用我们函数定义时的默认值
当我们在调用函数的时候指定值的时候使用的参数就是指定值
1.1 半缺省参数
半缺省参数即使缺省一部分的参数(注意这里并不是一半)
注意点!!!
我们这里必须要从右往前缺省参数 以下格式是绝对不可以的
我们有代码如下
void func2(int a , int b = 20, int c = 30)
{
cout << "a: " << a << endl;
cout << "b: " << b << endl;
cout << "c: " << c << endl;
}
调用格式如下
func2(10);
打印结果如下
1.2 全缺省参数
比如说这样子的代码
void func3(int a=10, int b = 20, int c = 30)
{
cout << "a: " << a << endl;
cout << "b: " << b << endl;
cout << "c: " << c << endl;
}
我们可以有以下调用方式
int main()
{
func3();
func3(1);
func3(1,2);
func3(1,2,3);
return 0;
}
但是我们这里要注意的是
像是这样子的调用是绝对不被允许的
//func(, ,3)
因为我们的函数传参是严格按照从左到右的顺序
二. 函数重载
2.1 重载是什么意思?
从简单说,就是函数或者方法有相同的名称,但是参数列表不相同的情形
也就是说 一个函数名可以对应多个函数
那么我们要怎么区分这几个函数呢?
2.2 如何区分重载函数
参数类型不同
例如下面两个函数
void test1(int a)
{
;
}
void test1(double a)
{
;
}
它们就是两个同名的重载函数
参数个数不同
例如下面这两个函数
void test1(int a)
{
;
}
void test1(int a , char b)
{
;
}
参数顺序不同
例如下面这两个函数
void test1(int a , char b)
{
;
}
void test1(char a, int b)
{
;
}
附加题1
我们来思考下这两个函数
它们是否是重载函数呢
void test1()
{
;
}
void test1(int a = 10)
{
;
}
我们这里传参的时候是不会报错的
但是如果说不传参的话就会存在歧义
对吧 两个都可以不传参调用 你要返回哪个呢?
附加题2
返回值不同 这里构成重载嘛?
这个问题是不是和上面的一样啊
我们怎么区分要调用哪个函数呢?
2.3 c++支持函数重载的原理
我们都知道 函数处理需要进行四个阶段
预处理
它的作用有四个
头文件展开
宏定义的替换
条件编译
去掉注释
编译
检查语法
所以说我们的语法错误报错是在编译阶段报错的
汇编
转换成二进制指令
连接
合并段表
符号表的合并和重定位
这里主要问题出现在连接阶段
为什么呢?
这里简单的提一嘴
在第三步汇编语言变成了二进制语言
在c语言中
是函数调用call函数 再调用jump函数 再找到函数
是这样子的 f(?)
再c++中
也是一个这样子的过程
但是会对函数名字(由于参数不同)进行一个加工所以说c++会支持重载函数
总结
本节课学习了缺省参数(包括半缺省和全却省)
学习了重载函数(如何区分)
简短的介绍了c++的函数重载原理