1. 函数后置返回类型
void func(int,int); //函数声明(函数原型),通常定义在头文件中,函数声明时,可以只有形参类型,没有形参名。
把函数返回类型放到函数名字之前,这种写法叫前置返回类型 //func(1,2)
后置返回类型:在函数声明和定义中,把返回类型写在参数列表之后。
auto func(int a,int b)->void;//后置返回类型函数声明
2. 内联函数//inline:在函数定义前加了关键字inline,该函数变成内联函数
针对问题:函数体很小,调用又很频繁,引入了inline
a.inline影响编译器,在编译阶段对inline函数进行处理,系统尝试将调用该函数的动作替换成函数本体,通过这种方式来提升性能。
inline void func(int p){
return 1;
}
int abc = func(5)://int abc = 1;
b. inline只是对编译器的一个建议,编译器可以尝试去做也可以不去做,这取决于编译器的诊断功能。
c.内联函数的定义要放在.h头文件中,这样需要用到这个内联函数的.cpp文件都能够通过#include把这个内联函数#include,以便找到这个函数的本体源代码并尝试该函数的调用并替换为函数体 内的语句。
优缺点:可能带来代码膨胀的问题,所以内联函数尽量要小
注意:各种编译器对inline的处理都不相同,inline函数尽量简单,代码尽可能小,循环、分支、递归调用尽量不要出现在inline函数中。
//constexpr函数:将该函数用在常量表达式的调用中,可以看成是更严格的内联函数
//#define宏展开也类似于inline
3. 函数杂合用法总结
a.void:void表示函数不返回任何类型,但是可以调用一个返回类型是void的函数让它作为另一个返回类型是void的函数的返回值
example:
void funca(){
return;
}
void funcb(){
return funca();
}
b.函数返回引用或者指针
//返回指针的
int* func(){
int p = 10;
return &p;
}
int main(){
int *q = func(); //这样把系统已经释放的内存重新指向一个指针,具有重大隐患
}
//返回引用的
c.没有形参可以保持形参列表为空(),或者int func(void)
d.如果一个函数不调用的话,可以只声明,不定义
e.普通函数可以声明多次,只能定义一次,一般函数定义cpp文件会#include自己的声明文件
f.void func(int &a,int &b) :这样可以间接地返回多个值,通过引用改变外界的参数
g.c++中的函数可以重名,但是形参类型或者数量必须不同
4. const char*、char const*、char*const的区别
//char*p;和const混用
a.const char*p //pz指向的东西不能通过p来修改(p所指向的目标,那个目标中的内容不能通过p来修改)
char str[] = "who are you";
const char *p;
p = str;
*p = ‘Y‘; //语法错误
p++;
str[0] = "Y"; //这样可以
b.char const * 等价于const char *p;
c.char*const p:定义的时候必须初始化,p一旦指向了一个东西之后,就不能再指向其他的东西了
char str [] = "who are you";
char*const p = str; //定义的时候必须初始化,p一旦指向了一个东西之后,就不能再指向其他的东西了
p++; //不可以
*p = "Y";//可以改变其中的内容
c.char const * const p = str; //既不能改变其中的内容,也不能指向别的变量
d.const用于引用
int i = 100;
const int &a = i;
a = 500; //不可以,a是一个常量
e.int &b = 31; //错误的,会报错
const int &b = 31;
5. 函数形参中带const
void func(const student &stu){ //在形参前加const的优点:1.防止无意中修改形参值导致实参值被无意修改;2.实参类型可以更灵活
stu.num=1000;
}
原文:https://www.cnblogs.com/cy2837/p/12203401.html