📙 作者简介 :RO-BERRY
📗 学习方向:致力于C、C++、数据结构、TCP/IP、数据库等等一系列知识
📒 日后方向 : 偏向于CPP开发以及大数据方向,欢迎各位关注,谢谢各位的支持
目录
- 1. 缺省参数
- 1.1 缺省参数概念
- 2.2 缺省参数意义
- 2.函数重载
- 2.1 函数重载概念
- 2.2 C++支持函数重载的原理--名字修饰
1. 缺省参数
1.1 缺省参数概念
缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参。
2.2 缺省参数意义
我们先来看一段程序
#include<iostream>
using namespace std;
//void Func(int a, int b = 10, int c = 20) //半缺省参数
//{
// cout<<"a = "<<a<<endl;
// cout<<"b = "<<b<<endl;
// cout<<"c = "<<c<<endl;
//}
void Func(int a = 10, int b = 20, int c = 30) //全缺省参数
{
cout << "a=" << a << endl;
cout << "b=" << b << endl;
cout << "c=" << c << endl<<endl;
}
//1. 半缺省参数必须从右往左依次来给出,不能间隔着给
//2. 缺省参数不能在函数声明和定义中同时出现
int main()
{
//全缺省传参 缺省值必须是从右往左给,必须是连续给
Func();
//半缺省传参
Func(1);
Func(1,2);
Func(1,2,3);
return 0;
}
运行结果为:
我们能不能Func( ,2, );我们把第一个参数和第三个参数省略,这样传参可以吗?
答案是不可以
跳跃传参时不可以的,只能从左往右依次传参,不能中间有空的,但是可以将后面的参数空掉。
我们能不能只传两个参数呢?写成这样:Func(1,2)
这样是不可以的,在编译器中是分析不清的,他不知道你这个是赋值给a和b还是a和c又或者b和c
所以我们需要在1,2后面加上一个逗号,表示缺省最后一个参数
缺省参数声明和定义必须为一致的,不能你声明的时候给其赋值了,定义的时候又赋值为另一个值,又或者一个赋值了另一个没有赋值
如果声明与定义位置同时出现,恰巧两个位置提供的值不同,那编译器就无法确定到底该用那个缺省值。
如果声明和定义分离,不在同一个文件。那么最好在声明的地方给赋值
2.函数重载
C语言是不支持同名函数的,但是有时候是我们需要实现同名函数的
比如我们想实现一个整形相加的函数另一个是浮点型的相加函数,想用一个名字Add怎么办
C语言这里就会报错
C++却可以
但是有几个要求
对于同名函数:
- 两个函数的返回值可相同可不同,
- 要保证参数不同(参数类型不同或者参数个数不同) 二者满足其一即可
2.1 函数重载概念
函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这
些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同,常用来处理实现功能类似数据类型
不同的问题。
#include<iostream>
using namespace std;
int Add(int a, int b)
{
cout << "int Add(int a,int b)" << endl;
return a + b;
}
double Add(double a, double b)
{
cout << "double Add(double a,double b)" << endl;
return a+b;
}
int mian()
{
Add(1, 2);
Add(1.1, 2.2);
return 0;
}
这样就实现了两个不同类型的Add函数了
2.2 C++支持函数重载的原理–名字修饰
为什么C++支持函数重载,而C语言不支持函数重载呢?
在C/C++中,一个程序要运行起来,需要经历以下几个阶段:预处理、编译、汇编、链接。
程序编译的时候
-
第一步为: 预处理 : 头文件展开/宏替换/条件编译/去掉注释等等… 生成Test.i 函数的声明以及实际调用
生成Func.i 函数的声明定义
一般程序主要就是头文件展开 -
第二步为: 编译 : 检查语法/生成汇编代码 生成Test.s Func.s
编译的过程是一个非常复杂的过程也是最重要的部分 -
第三步为: 汇编 : 转换成二进制的机器码 生成Test.o Func.o
-
第四步为: 链接 : 合并到一起,链接一些没有确定函数地址等等 合并生成 a.out
出现链接错误一般是函数声明了没有定义
C语言链接函数地址的时候,使用函数名去找的 (C语言不存在同名函数)
C语言存函数的时候也是一个函数名对应一个函数地址
C++中函数的存储是通过字母+函数名字符个数+函数名+参数首字母来存储的
就可以精确到每一个函数
Windows下名字修饰规则
通过这里就理解了C语言没办法支持重载,因为同名函数没办法区分。而C++通过函数修饰规则来区分,只要参数不同,修饰出来的名字就不一样,就支持了重载。
结论:在linux下,采用g++编译完成后,函数名字的修饰发生改变,编译器将函数参
数类型信息添加到修改后的名字中。