专业网站建设机构,网站的免费空间是什么,百度海外视频网站建设,百度推广的效果C语法相关知识点可以通过点击以下链接进行学习一起加油#xff01;命名空间 本章将分享缺省参数与函数重载相关知识#xff0c;为了更加深入学习C打下了坚实的基础。本章重点在于缺省参数与函数重载使用前提与注意事项 #x1f308;个人主页#xff1a;是店小二呀 #x1…
C语法相关知识点可以通过点击以下链接进行学习一起加油命名空间 本章将分享缺省参数与函数重载相关知识为了更加深入学习C打下了坚实的基础。本章重点在于缺省参数与函数重载使用前提与注意事项 个人主页是店小二呀 C语言笔记专栏C语言笔记 C笔记专栏 C笔记 初阶数据结构笔记专栏 初阶数据结构笔记 Linux笔记专栏 Linux笔记
喜欢的诗句:无人扶我青云志 我自踏雪至山巅 文章目录 一、缺省参数1.1 缺省参数的概念1.2 缺省函数分类1.3 正确使用缺省参数前提 二、函数重载2.1 函数重载概念2.2 使用函数重载前提2.3 C支持函数重载的原理-名字修饰(name Mangling) 一、缺省参数
1.1 缺省参数的概念
缺省参数是声明或定义函数时为函数的参数指定一个缺省值(默认值)。在调用该函数时如果没有指定实参则采用该形参的缺省值(默认值)否则使用指定的实参。
#include iostream
using namespace str;
void Func(int a0)
{countaendl
}
int main()
{Func();//0Func(10);//10
}
1.没有传参使用参数的默认值
2.传参使用指定的参数1.2 缺省函数分类
全缺省函数:
void Func(int a 10, int b 20, int c 30)
{couta aendl;coutb bendl;coutc cendl;
}半缺省函数:
void Func(int a, int b 10, int c 20)
{couta aendl;coutb bendl;coutc cendl;
}1.3 正确使用缺省参数前提
第一点重点:
缺省参数不能在函数声明和定义同时出现
说明:从两个方面来说一方面如果声明与定义位置同时出现恰好两个位置提供的值不同那么编译器就无法确定到底该使用哪个缺省值另一个方面来说就算两个位置提供的值相同祖师爷规定也不能这种方式操作
2.缺省参数选择在函数声明出现
说明:一般将声明放在头文件中而头文件将在编译阶段进行展开进行语法检查。对于函数地址而言是用于执行一堆指令(Call 函数中指令)到CPU中处理那么函数地址是第一个指令地址而函数定义才会使用到地址函数声明不存在有效地址。
那么在编译阶段对于函数声明编译器选择放过呢由于编译器是进行语法分析在链接时函数声明会通过无效地址到符号表定位到真正函数的地址。
重定位就是在链接地址跟运行地址不同的情况下执行一段位置无关码这段位置无关码的作用就是将原来的那份代码全部复制到链接地址那里去然后自己再长跳转到新的那份代码的刚刚执行的那个位置。这样就实现了链接地址跟运行地址一致的情况 具体场景辅助理解 你要买房需要首付30w现在手头只有20w打了一通你的室友电话你的室友同意借你10w。到首付的时候你室友的10w迟迟没有到账后面才知道你室友家破产了借不出去答应借你10w声明/承诺
答应借你10w声明/承诺转账给你10w定义/兑现
第二点:
半缺省实或形参数必须从右往左依次来给出不允许间隔着给
说明在语法层次上我们属于学习者是根据语法规定来进行学习。如果想要更有说服力的答案在调试阶段通过鼠标右边点击反汇编从图中我们可以得到传参是传参是从右到左push数据 部分补充:
缺省参数必须是常量或者全局变量C语言不支持缺省参数
缺省参数使用场景:无法得知插入准确值
//1.确定要插入100个数据
StackInit(st1, 100);
//1.确定要插入10个数据
StackInit(st2, 10);
// 3、不知道要插入多少个
StackInit(st3);二、函数重载
自然语言中一个词可以有多重含义人们可以通过上下文来判断词真实的含义该词被重载了。有卧龙必有凤雏
2.1 函数重载概念
函数重载是函数的一种特殊情况C允许在同一作用域中声明几个功能类似的同名函数,常用来处理实现功能类似数据类型不同的问题而C语言不允许同名函数
2.2 使用函数重载前提
函数重载需要满足其中一个条件:
参数类型不同参数个数不同参数类型顺序不同(本质是参数类型不同)
#includeiostream
using namespace std;
// 1、参数类型不同
int Add(int x,int y)
{return xy;
}
int Add(double x,double y)
{return xy;
}// 2、参数个数不同
void f()
{coutf()endl;
}
void f(int a)
{coutf(a)endl;
}// 3、参数类型顺序不同(本质还是参数类型不同)
void f(int a, char b)
{cout f(int a,char b) endl;
}
void f(char b, int a)
{cout f(char b, int a) endl;
}
int main()
{Add(10, 20); //call(?)Add(10.1, 20.2); //call(?)f();f(10);f(10, a);f(a, 10);return 0;
}2.3 C支持函数重载的原理-名字修饰(name Mangling)
我们知道C语言不支持函数重载那么C如何去支持函数重载呢 f(10, a); //call(?)f(a, 10); //call(?)首先简单快速过一遍关于程序在编译环境下的流程
在C/C程序运行之前需要进行以下几个阶段:预处理、编译、汇编、链接 每个编译器都有属于自己的一套函数名修饰规则windows下vs的修饰规则过于复杂而Linux下g的修饰规则简单
int Add(int a,int b)
{return ab;
}
void func(int a,double b,int *p)
{}
int main()
{Add(1,2);func(120)return0
}采用C语言编译器 采用C编译器
C语言在linux下采用gcc编译完成后函数名字的修饰没有发生改变C在linux下采用gcc编译完成后函数名字的修饰发生改变,编译器将函数参数类型信息添加到修饰后名字中
梳理:由于C语言在链接时直接使用函数名去找地址同名函数无法区分不开。C可以通过函数名修饰规则将名字引入参数类型(不同编译器有不同规则)。只要参数不同修饰出来的名字就不一样就支持了重载。如果两个函数的函数名和参数时一样的返回值不同是不构成重载的 以上就是本篇文章的所有内容在此感谢大家的观看这里是店小二呀C笔记希望对你在学习C语言旅途中有所帮助