东营网站建设天锐科技,现在网站前台用什么做,丹江口网站建设,网上运营培训班文章目录 #x1f96e;一、缺省参数#x1f355;1、基本概念#x1f355;2、缺省参数的分类#x1f6a9;全缺省参数#x1f6a9;半缺省参数#x1f6a9;缺省参数实用案例 #x1f96e;二、函数重载#x1f355;1、函数重载概念1️⃣参数类型不同2️⃣参数个数不同3️⃣… 文章目录 一、缺省参数1、基本概念2、缺省参数的分类全缺省参数半缺省参数缺省参数实用案例 二、函数重载1、函数重载概念1️⃣参数类型不同2️⃣参数个数不同3️⃣参数类型顺序不同 三、C支持函数重载的底层原理--函数名修饰 一、缺省参数
1、基本概念 缺省参数是声明或定义函数时为函数的参数指定一个缺省值。 在调用该函数时如果没有指定实参则采用该形参的缺省值否则使用指定的实参。 举个栗子
//缺省参数
void Func(int a 1)
{cout a endl;
}int main()
{Func(10);Func();return 0;
}注意缺省值(函数形参的默认值)不能同时在函数声明和函数定义中给出(缺省参数不能在函数声明和定义中同时出现); 注意缺省值必须是常量或者全局变量。 2、缺省参数的分类
全缺省参数 全缺省参数每个形参都指定缺省值 举个栗子
//全缺省参数
void Func(int a 10, int b 20, int c 30)
{cout a a endl;cout b b endl;cout c c endl endl;
}int main()
{Func();//显示传参从左往右显示传参Func(1);Func(1,2);Func(1, 2, 3);return 0;
}半缺省参数 半缺省参数为部分形参指定缺省值 举个栗子
//半缺省参数
void Func(int a, int b 10, int c 20)
{cout a a endl;cout b b endl;cout c c endl endl;
}int main()
{Func(1);Func(1,2);Func(1, 2, 3);return 0;
}注意半缺省参数必须从右往左依次来给出不能间隔着给 ❌下面这种情形是不允许的
void Func(int a 10, int b, int c 20)
{cout a a endl;cout b b endl;cout c c endl endl;
}缺省参数实用案例
假如要实现一个栈的结构我们不知道要入栈插入多少个数据所以不知道初始化开辟多少内存空间合适给多了浪费给少了不够用这时我们就可以使用缺省参数
请看演示代码
Stack.h
#includestdlib.h
namespace N1
{typedef struct Stack{int* a;int top; int capacity;}ST;//不允许声明和定义同时给缺省参数//声明给定义不给void StackInit(ST* ps, int N 4){ps-a (int*)malloc(sizeof(int) * N);ps-top 0;ps-capacity 0;}Test.cpp
#include Stack.hint main()
{N1::ST st1;StackInit(st1, 10);//知道10个for (size_t i 0; i 10; i){StackPush(st1, i);}N1::ST st2;StackInit(st2, 100);//知道100个for (size_t i 0; i 100; i){StackPush(st2, i);}//不知道可能会插入多少个N1::ST st3;StackInit(st3);return 0;
}二、函数重载 自然语言中一个词可以有多重含义人们可以通过上下文来判断该词真实的含义即该词被重载了。 比如以前有一个笑话国有两个体育项目大家根本不用看也不用担心。一个是乒乓球一个 是男足。前者是“谁也赢不了”后者是“谁也赢不了” 1、函数重载概念 函数重载是函数的一种特殊情况C允许在同一作用域中声明几个功能类似的同名函数这些同名函数的形参列表(参数个数 或 参数类型 或 参数类型顺序)不同常用来处理实现功能类似数据类型不同的问题。 重载函数之间是通过函数的 形参个数 或 形参类型 或 形参类型顺序 来区分的(只有这三个区分标准)重载函数之间的区分在于形参的差异。
1️⃣参数类型不同
// 1、参数类型不同
int Add(int left, int right)
{cout int Add(int left, int right) endl;return left right;
}
double Add(double left, double right)
{cout double Add(double left, double right) endl;return left right;2️⃣参数个数不同
// 2、参数个数不同
void func1()
{cout func1() endl;
}
void func1(int a)
{cout func1(int a) endl;
}3️⃣参数类型顺序不同
// 3、参数类型顺序不同
void func2(int a, char b)
{cout func2(int a,char b) endl;
}
void func2(char b, int a)
{cout func2(char b, int a) endl;
}int main()
{cout Add(10, 20) endl;cout Add(10.1, 20.2) endl;cout endl;func1();func1(10);cout endl;func2(10, a);func2(a, 10);return 0;
}注意以下两种情况不构成函数重载
namespace M1
{void func(int x){};
}namespace M2
{void func(int x){};
}不在同一作用域中函数重载必须在同一作用域中☝️
namespace M1
{void func(int x){};
}namespace M1
{void func(int x){};
}自动合并了☝️
namespace M1
{void func(int x){};
}namespace M1
{void func(double x){};
}构成函数重载✅
函数重载和缺省参数没有关系
void func(int a)
{cout void func(int a) endl;
}void func(int a, int b 1)
{cout void func(int a, int b) endl;
}int main()
{func(1, 2);//调用存在歧义,不知道调用哪个//func(1);return 0;
}三、C支持函数重载的底层原理–函数名修饰
形成可执行文件要四个阶段预处➡️编译➡️汇编➡️链接
void func(int i, double d)
{cout void func(int i, double d) endl;
}void func(double d, int i)
{cout void func(double d, int i) endl;
}int main()
{func(1, 1.1); // call func()func(1.1, 1); // call func()return 0;
}对这段代码编译生成反汇编 call指令是通过函数的符号表来定位函数的地址的 但是在C语言中函数符号表中函数的命名规则就是原模原样地照搬源文件中的函数标识名。 C符号表中的函数名修饰 在符号表中各个函数的命名都遵循一定的函数名修饰规则 在g编译环境(支持C的编译器)中符号表中的函数名经过修饰后变成【_Z函数名长度函数名类型首字母】(这点和C语言的符号表中函数的命名规则完全不同) C(g编译环境)这种名字修饰规则使得标识名相同形参不同的函数在符号表中得到了区分因此编译器在编译和链接的过程中就能根据函数调用语句具体的实参类型明确地找到相应重载函数的函数体的地址并访问函数体中的指令实现了重载函数的调用。 C语言中不存在这种名词修饰规则因此在符号表中标识名相同的函数的符号表命名也是相同的所以编译器在编译和链接的过程中无法对同标识名函数进行区分所以无法实现函数重载。 这期内容有一点点难理解希望烙铁们能理解消化有所收获哦 总结 以上就是 【C】缺省参数函数重载 的全部内容啦 本文章所在【C初阶】专栏感兴趣的烙铁可以订阅本专栏哦 前途很远也很暗但是不要怕不怕的人面前才有路。 小的会继续学习继续努力带来更好的作品 创作写文不易还多请各位大佬uu们多多支持哦