【c++】c语言入门到c++使用高手:深入学习C++之基本语言(六)

发布时间:2026/10/23 4:03:26
【c++】c语言入门到c++使用高手:深入学习C++之基本语言(六) 第二章 基本语言第六节 函数新特性、内联函数、const详解1. 函数回顾与后置返回类型函数定义中,形参如果在函数体内用不到的话,则可以不给形参变量的名字,只给其变量函数声明又叫函数原型把函数返回类型放到函数名字之前,这种写法就是前置返回类型c11中引入了一种新的写法,后置返回类型:就是在函数声明和定义中,把返回类型写在参数列表之后,前面放auto,表示函数返回类型放到参数类表之后#includeiostream#includecstringusing namespace std;//auto :变量自动类型推断//函数声明autofunc123(inta,intb)-void;autofunc123(inta,intb)-void{cout后置函数类型endl;return;}intmain(){func123(1,2);return0;}2. 内联函数函数定义前添加关键字inline,导致该函数变成了内联函数函数体很小,调用有很频繁,就需要引入inline(内联)函数inline影响编译器,在编译阶段对inline这种函数进行处理,系统尝试将调用该函数的动作替换为函数本体,通过这种方式来提升性能inline只是开发者对编译器的一个建议,编译器可以尝试去做,也可以不去做,取决与编译器的诊断功能,决定权在编译器内联函数定义要放在头文件中,这样需要源代码用到内联函数的.cpp文件都能够通过include把内联函数的包含进来,以便找到这个函数的本体源代码并尝试将该函数的调用替换为函数体内的语句优缺点提升效率代码膨胀,所以内联函数函数体尽量要小注意: 不同编译器对inline函数处理不同,inline函数尽量简单,代码尽可能少,减少循环,分支递归调用尽量不要出现在inline函数中,编译器有可能拒绝这个函数成为inline函数constexpr函数: constexpr int mf(),需要写的非常简单,可以看成是更严格的一种内联函数#define宏展开也类似内联函数,类型检查?3. 函数杂合用法总结函数返回类型为void,表示函数不返回任何类型,但是我们可以调用一个返回类型是void函数让他作为另外一个返回类型是void的函数返回值#includeiostream#includecstringusing namespace std;voidfunca(){}voidfuncb(){// 可行// return;returnfunca();// 不可行// return void;}intmain(){return0;}函数返回指针和返回引用的情况#includeiostream#includecstringusing namespace std;int*myfunc(){inttempvalue9;returntempvalue;}intmain(){int*pmyfunc();// 函数调用完成后,内存已经被释放了, 所以这个地址是不可空的,程序会崩溃// 解决方案是把 int tempvalue 9 写成全局变量*p6;return0;}#includeiostream#includecstringusing namespace std;intmyfunc(){inttempvalue9;couttempvalueendl;returntempvalue;}intmain(){intkmyfunc();//还是不属于可控的地址,不能这么使用coutkendl;return0;}视频中是windows系统,下面代码可行,可是LZ是lunux系统,下段代码还是会崩溃,所以这种综合考虑来看,慎用!#includeiostream#includecstringusing namespace std;intmyfunc(){inttempvalue9;couttempvalueendl;returntempvalue;}intmain(){intkmyfunc();coutkendl;return0;}不带形参的函数定义:没有形参可以表示形参列表为空,或者(void)#includeiostream#includecstringusing namespace std;intmyfunc(void){return1;}intmain(){intkmyfunc();coutkendl;return0;}如果一个函数不调用的话,则该函数可以只有声明部分,没有定义部分普通函数(非内联函数)定义只能定义一次,声明可以声明多次,一般函数定义.cpp文件会include自己的函数声明.h文件引用做函数形参 void func(int ta, int tb),使用引用可以提升效率,函数可以返回多个返回值,在c中更习惯用引用类型的形参,来取代指针类型的形参,提倡在c中多使用引用类型的形参#includeiostream#includecstringusing namespace std;structstudent{intnum;// ...};voidfunc(structstudentstu){stu.num100;}intmain(){structstudentstu0;func(stu0);coutstu0.numendl;return0;}c中,函数允许同名,但是形参列表的参数类型或者数量应该不同#includeiostream#includecstringusing namespace std;voidfunc0(inti){}//void func(const int i){} 这种重名,不可行voidfunc0(floati){}voidfunc0(inti,intj){}intmain(){return0;}4. const char*, char const*, char* const三者的区别原始代码#includeiostream#includecstringusing namespace std;intmain(){charstr[]I am Felaim!;char*p;pstr;*pU;p;coutstrendl;return0;}const char *p, p指向的目标不能通过p来改变#includeiostream#includecstringusing namespace std;intmain(){charstr[]I am Felaim!;constchar*p;pstr;// 这段相当于用p来修改p指向的内存// *p U;// 但是p指向的地址可以修改p;str[0]U;coutstrendl;return0;}char const * 等价于 const char *char * const p, p指向的内存是固定的,不能改变,但是指向内存的内容可以修改#includeiostream#includecstringusing namespace std;intmain(){charstr[]I am Felaim!;// 定义的时候必须初始化, p一旦指向一个内存之后,就不可以指向其他内存char*constpstr;// p可以修改对应指向内存的内容*pU;// p指向的地址不可以修改// p;coutstrendl;return0;}const char* const p:p指向的地址和指向地址的内存均不可以改变#includeiostream#includecstringusing namespace std;intmain(){charstr[]I am Felaim!;// 定义的时候必须初始化, p一旦指向一个内存之后,就不可以指向其他内存constchar*constpstr;// p不可以修改对应指向内存的内容// *p U;// p指向的地址也不可以修改// p;coutstrendl;return0;}其他引用与const的用法范例#includeiostream#includecstringusing namespace std;intmain(){inti100;// 代表a的内容不能修改constintai;// 不可行// a 400;//不可行// int b 31;//可行方案,给b分配了内存,所以可行constintb31;coutbendl;//可行intci;return0;}5. 函数形参中带const优点:防止无意中修改形参值,导致实参值被无意修改实参类型可以更加灵活(既可以使用普通类型,也可以使用常量类型即加const的变量)范例一#includeiostream#includecstringusing namespace std;typedefstructstudent{intnum;// ...}student;// 学习在形参中增加const的写法的习惯//void func(const student stu) {// // 不会无意的修改其形参值// // stu.num 10086;//}voidfunc(studentstu){stu.num10086;}intmain(){student stu1;stu1.num1000;func(stu1);coutstu1.numendl;conststudentstu2stu1;// 如果使用func(student stu)则会报错// func(stu2);return0;}范例二#includeiostream#includecstringusing namespace std;voidfunc2(inti){}voidfunc3(constinti){}intmain(){intaaa10;// 可行func2(aaa);// 不可行// func2(2);// 可行, 进一步验证实参类型可以更加灵活func3(2);return0;}

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询