当前位置: 首页 > news >正文

建筑钢结构网站上海建筑信息平台

建筑钢结构网站,上海建筑信息平台,哪些网站做的比较好看的,win7 iis 发布asp.net网站4. 函数重载 函数重载就是同一个函数名可以重复被定义#xff0c;即允许定义相同函数名的函数。但是相同名字的函数怎么在使用的时候进行区分呢#xff1f;所以同一个函数名的函数之间肯定是要存在不同点的#xff0c;除了函数名外#xff0c;还有返回类型和参数两部分可以…4. 函数重载 函数重载就是同一个函数名可以重复被定义即允许定义相同函数名的函数。但是相同名字的函数怎么在使用的时候进行区分呢所以同一个函数名的函数之间肯定是要存在不同点的除了函数名外还有返回类型和参数两部分可以视为函数的特征。 以返回类型来区别因为在函数调用时不能显式地指出函数返回类型所以难以使用返回类型来区别。因此只剩下了参数来区分我们可以总结出以下三种常见的函数重载的情况 ①参数个数不相同 void func(int a, int b) {cout a b endl; } void func(int a) {cout a endl; } int main() {func(1, 2);func(1);return 0; } ②参数类型不同 void func(int a, char b) {cout a b endl; } void func(int a, int b) {cout a b endl; } int main() {func(1, a);func(1, 2);return 0; }③参数类型顺序不同 void func(int a, char b) {cout a b endl; } void func(char b, int a) {cout b a endl; } int main() {func(1, a);func(a, 1);return 0; }我们不禁发问为什么C支持函数重载而C语言不支持呢我以Visual Studio 2022为例不同编译器的规定方式不同。我们通过观察链接报错发现C语言中外部符号仅仅是函数名这就意味着函数在C语言编译中的符号就是函数名那么相同函数名肯定会产生冲突。 C就不一样了可以发现C给函数赋予的符号要更加复杂。通过观察规律我们会发现C在处理时加入了参数类型H表示intD表示char。因此虽然函数名相同但是参数不同编译器依然可以顺利区分达到函数重载的功能。 5. 引用 5.1 引用简介 引用是C相较于C语言创新的地方。引用可以理解为替一个已经存在的变量起一个别名这就意味着引用一旦定义那么可以认为引用变量就是原变量它们是同一个东西。因此定义引用变量时不开辟空间引用变量和原变量使用同一块空间。 int main() {int a 1;int ra a; //定义引用变量cout a ra endl;a;cout a ra endl;ra;cout a ra endl;return 0; } 定义引用类型的时候必须和引用实体是同种类型的。 5.2 引用的特性 ①引用在定义时必须初始化。之所以这么规定与第三条特定有关因为一旦创建了引用就无法再改变其引用的实体了所以如果不进行初始化那就无法再和需要的引用实体进行关联了。即引用变量和引用实体的配对一定发生且只发生在初始化时。 int main() {//int ra; //error 没有初始化int b;int rb b;return 0; } ②一个变量可以存在多个引用。 int main() {int a 1;int ra a;int rra a;return 0; } ③引用一旦引用一个实体再不能引用其他实体。这句话就是引用实体不可以发生改变这是因为会产生歧义。 int main() {int a 3;int b 8;int ra a;ra b;//歧义①将b的值赋值给ra②将b作为引用变量ra的实体 return 0; } 5.3 常引用 常引用顾名思义就是对一个常量的引用使用const进行修饰限制。值得注意的是常引用的引用实体并非都是常量而是一些具有常量性质的值字面量、常量、常变量、临时变量等。常引用自从初始化后便不会再改变换言之不可以通过赋值等手段修改常引用的值此时的常引用就可以被视为一个常量。 需要格外强调的两点 ①定义引用时权限可以缩小非常量值作为常引用的引用实体权限不可以放大常量值作为非常量引用的引用实体。 ②在之前的非常量引用定义时类型不同不可以初始化的原因是发生了隐式类型转换使得实际上是将具有常性的临时变量赋给非常量引用因此错误原因在于权限放大。根据这一点我们就可以知道常引用尽管类型不同但是因为隐式类型转换所以依旧可以正常定义。 int main() {const int a 10;//int ra a; //errorconst int ra a; //correct//int rb 10; //errorconst int rb 10; //correctdouble d 3.14;//int rd d; //errorconst int rd d; //correct,rd3 d首先隐式类型转换为int产生一个临时变量临时变量具有常性所以可以赋给常引用d 4.48;cout d rd endl; //4.48 3return 0; } 5.4 函数指针的引用 函数指针的引用注意点在代码注释中给出。 void func(int a) {cout a endl; } typedef void(**fpp)(int); typedef void(*fp)(int); typedef void(f)(int); int main() {//对于定义函数指针引用//1.注意定义的引用的类型和引用实体的类型相同。// ①函数名有两种解释方式函数名具有右值属性。以func为例void(*)(int)和void()(int)// ②注意辨别不同级函数指针。void(*pf)(int) func;void(**ppf)(int) pf;//2.注意区别左值右值左值只能使用非常量引用右值只能使用常量引用// 区分左右值的方式判断能否位于赋值符号左边。如*p可以就是左值func不可以就是右值// 注意函数名是右值所以在定义类似于void()(int)类型的引用不是指针的函数类型时,一定是常量引用//3.注意定义函数指针的引用可以存在两种方式①使用typedef②不使用typedef。/*f func_;f rfunc_ func;rfunc_ func;*/ //void()(int)类型的引用一定是常量引用//非常量引用的定义方式//1.使用typedeffp r2 pf;//r2 func;fpp r3 ppf;//r3 r2;//2.不使用typedefvoid(*rr2)(int) pf;//rr2 func;void(**rr3)(int) ppf;//rr3 rr2;//常量引用的定义方式//f r1 func;//void(rr1)(int) func; //以上两种方式虽然可行不报错但是体现不出常引用所以不建议使用//r1 func;//rr1 func;//1.使用typedefconst f r1_c func;//r1_c func;const fp r2_c pf;//r2_c func;const fpp r3_c ppf;//r3_c r2;//2.不使用typedefvoid(const rr1_c)(int) func;//rr1_c func;void(*const rr2_c)(int) pf;//rr2_c pf;void(**const rr3_c)(int) ppf;//rr3_c ppf;const fp r_a func;const fp r_b func;void(* const r_c)(int) func;void(* const r_d)(int) func;// 因为函数名有两种解释方式所以上述的定义方式也是正确的void(*r_e)(int) *ppf;//void(*r_e)(int) func;//void(*r_e)(int) func;//因为*ppf是左值所以没有问题而func和func是右值所以会报错return 0; } 5.5 引用的应用 5.5.1 传递参数输出型参数 C语言中输出型参数采取传指针的方式C中可以使用引用来传递效果相同但是代码更加简洁。 void swap(int a, int b) {int tmp a;a b;b tmp; } int main() {int x 1;int y 2;swap(x, y);cout x y endl;return 0; } 5.5.2 传递参数大空间对象传参减少拷贝 在传递如结构体等大空间对象时为了减少拷贝提高效率可以使用引用来传参。 struct Node {struct Node* next;int val; }; void func(struct Node node) {} int main() {struct Node n1;func(n1); } 5.5.3 做返回值 这里给出一个引用做返回值的正确例子。我们在下文详细分析引用作返回值的特性。 int Add(int a,int b) {//static int x a b; //这样写因为static只定义一次所以会导致再次调用函数时不会执行这一步。static int x;x a b;return x; } int main() {int a Add(2,4);cout a endl;a Add(8, 9);cout a endl;return 0; } 那么让引用成为返回值有什么好处与注意事项呢我们对比着返回值的情况来分析。 ① 返回引用可以省去拷贝返回时内存中不产生副本。值返回首先将值交给寄存器然后释放栈帧再然后将寄存器的值mov到需要的位置。在此期间就存在拷贝副本的产生相当于寄存器充当了临时变量的作用。引用返回则是直接返回变量省去了中间变量的拷贝开销。如果是使用变量接收则相当于拷贝赋值如果使用引用接收则是相当于定义引用。所以引用返回值效率更高。 ②注意引用返回的变量不可以是局部非静态变量因为局部非静态变量在栈帧中当函数结束栈帧释放后返回值就变得不可控了。 int cal1(int a) {int b a * 2;return b; } int cal2(int a) {static int b;b a * 2;return b; } int main() {int num1 cal1(1); //case1返回方式返回值。//在栈中开辟空间的b在函数结束后将值交给临时变量寄存器再由临时变量交给num1内存中产生了返回值的副本临时变量//int num2 cal1(2); //case2报错因为函数返回的值是临时变量具有常性int num3 cal2(3); //case3返回方式返回引用。//在函数结束后因为是返回引用所以实际上是返回b变量的别名。而num3的值则是直接从b变量处拷贝而来避免了副本的产生。//因为b变量是一个静态变量所以不会随着栈帧被释放才能在栈帧释放后进行拷贝。int num4 cal2(4); //case4返回方式返回引用。//在函数结束后返回了b变量且不产生副本而引用声明num4使用返回值初始化所以num4就成为了b变量的引用、别名。//因为b变量是一个静态变量所以不会随着栈帧被释放所以引用依旧有效。 } 5.6 引用和指针 ①引用相当于是一个别名不占空间。但在底层实现上各个编译器有所不同一般情况下引用实际上就是一个指针实现的。所以在实际来说引用还是占空间的。 ②在我看来引用是指针的更简单的表达形式。引用变量实际就是指向引用实体的指针而使用引用变量时默认会进行解引用。 ③没有空引用与多级引用但是有空指针和多级指针。 ④引用必须初始化并且不可以改变引用实体。指针则可以不受这些限制。 通过以上叙述发现引用虽然是指针的简练表达但是仅仅限于某些特定情况下。指针还是通用的方法所以引用只能是极大简化指针的使用但是无法代替指针。
http://www.pierceye.com/news/944294/

相关文章:

  • 榆林市住房和城市建设局网站网络系统管理比赛
  • 学校网站建设论文哪里网站备案最快
  • 上海公交建设公司官网seo排名优化工具
  • 网站设计与网站制作什么是网络营销中最容易出问题的步骤
  • 网站做自适应好不好网站开发结构图
  • wordpress sky主题东莞整站优化排名
  • 黑龙江 建设监理协会网站开发公司资质查询
  • 中标建设集团有限公司 网站怀化主要网站
  • 国外网站seo国外企业网站建设
  • 很简单的做设计的网站网站建设会议讲话
  • 泉港区建设局网站廉政配置wordpress环境
  • 公众号开发培训网站谷歌优化怎么做
  • 网站设计合理汕头市潮南区紧急提醒
  • 国外网站流量查询企业网站报价单
  • 聊城高唐网站建设公司wordpress设置域名
  • 有帮忙做儿童房设计的网站吗东莞横沥网站制作
  • 国外网站模板欣赏WordPress 编辑器修改默认字号
  • 厦门同安网站建设视频购物网站开发方案
  • 什么是建设网站的主题兼职做问卷调查的网站
  • 装饰网站建设软件下载公司旅游视频网站模板免费下载
  • aws网站建设个体户做网站去哪里做
  • 用四字成语做网站域名好吗宁波网站推广专业服务
  • 深圳网站建设公司是网络推广网上营销
  • 网站视频站建设教程和仿qq商城版淘宝客网站源码模板+带程序后台文章dede织梦企业程序
  • 温州红酒网站建设长沙移动网站建设
  • 如何制作网站?企业网站制作步骤
  • 桓台县旅游网站建设购物网站建设技术难点
  • 单页网站推广网站qq链接怎么做
  • wordpress仿站步骤平乡网站建设
  • 青岛高端网站建设公司新网站seo技术