网站建设公司使用图片侵权使用者有无责任,西峡微网站建设,手机网站解析,公司推广策划方案目录 C/C语言 函数调用的工作原理#xff1a;
函数调用一般分为两个部分#xff1a;
缺省参数#xff1a;
缺省参数的分类#xff1a;
全缺省参数
半缺省参数
注意事项#xff1a;
缺省参数与C语言的调用参数对比#xff1a;
函数重载#xff1a;
函数重载…
目录 C/C语言 函数调用的工作原理
函数调用一般分为两个部分
缺省参数
缺省参数的分类
全缺省参数
半缺省参数
注意事项
缺省参数与C语言的调用参数对比
函数重载
函数重载的工作原理
函数重载的分类 C/C语言 函数调用的工作原理
在讲诉缺省参数和函数重载之前我们首先要了解一下C语言/C的 函数调用的工作原理。
函数调用一般分为两个部分
函数声明函数定义 函数声明主要是写在头文件中而函数定义则写在.c或.cpp的源文件中并且函数定义使用包含头文件的方式对头文件进行连接。 而后通过Linux的翻译工作原理我们可以知道编译器在执行代码之前会执行四个步骤分别是预处理、编译、汇编、链接。
其中在预处理阶段函数定义中包含的头文件会将头文件的内容完全展开并复制在定义代码的上方。
其次在链接阶段函数定义中的代码会变成一串机器代码以便编译器进行执行而这一串机器代码在形成的过程中会将这一大串代码的首个元素的地址发送到一共特点的函数中最后这个函数同样会形成一个地址发送到函数声明中由函数声明调用。 也就是说函数调用的工作原理其实是 函数声明------(中间函数地址)----中间函数------(函数定义的首元素地址)------函数定义代码 且需要注意一点的是没有函数定义也就不会产生函数定义的代码即使有函数声明也无法使用函数的调用 缺省参数
缺省参数通俗来讲就是默认参数在函数调用的时候给予调用的参数一个默认值当没有给予这个参数数值时就调用这个默认值进行函数的运算或者执行函数。
void Func(int a 0)
{coutaendl;
}
int main()
{Func(); // 没有传参时使用参数的默认值Func(10); // 传参时使用指定的实参
return 0;
}缺省参数的分类 全缺省参数
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;}
注意事项
需要注意的是缺省参数的设置是从右往左而非从左往右且缺省参数必须是连续设置中间不能突然断掉就如图下面代码所示
//下面代码是错误的
void Func(int a 10, int b, int c 20){couta aendl;coutb bendl;coutc cendl;}
同时还需要注意在使用新参数覆盖缺省参数时也必须连续覆盖而不能跳过覆盖
void Func(int a 5, int b 10, int c 20){couta aendl;coutb bendl;coutc cendl;}
int main()
{Func(); //正确的Func(10); //正确的Func(1,2); //正确的Func(1,2,3); //正确的Func(1,,2); //不正确的Func(,2,3); //不正确的
return 0;
}最后 需要注意缺省参数最好在声明中出现如果想要定义中也出现最好函数定义部分的缺省参数必须和声明中的缺省参数保持一致
//a.hvoid Func(int a 10);// a.cppvoid Func(int a 20){}// 注意如果声明与定义位置同时出现//恰巧两个位置提供的值不同那编译器就无法确定到底该用那个缺省值。
缺省参数与C语言的调用参数对比
如下代码所示当函数调用时没有使用缺省参数则使用Func()和Func(10)会发生报错问题而使用了缺省参数后 空出的部分或者说没有使用数值的部分默认使用了缺省参数这就是缺省参数和普通调用参数的不同之处
void Func(int a 5, int b 10, int c 20){couta aendl;coutb bendl;coutc cendl;}
int main()
{Func(); Func(10); return 0;
}函数重载
函数的一种特殊情况C允许在同一作用域中声明几个功能类似的同名函数这 些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同常用来处理实现功能类似数据类型 不同的问题。
简单来说函数重载允许使用相同的函数名但不同的是内部的参数必须不一样
函数重载的工作原理
上文讲诉过函数在调用时在链接的阶段会访问到中间函数而中间函数的内部可能会有多个函数的地址而链接编译器则会通过函数的名字来寻找他所对应的函数从而找到函数定义的地址
而C语言中函数不能同名的原因也是如此连接编译器会分不清楚到底那个是它需要的地址。
但是c就不会因为在c的默认规则中每输入一共函数这个函数就会被编译器默认的在内部修改名字所以就不会有着函数名字重复的冲突了
函数重载的分类
#includeiostream
using namespace std;// 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、参数个数不同
void f()
{cout f() endl;
}
void f(int a)
{cout f(int 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);Add(10.1, 20.2);f();f(10);f(10, a);f(a, 10);return 0;}