1.为函数的参数赋予默认值,如果给函数的某个参数设置了默认值,那么参数列表中该参数后面的所有参数都必须有默认值,调用函数的时候如果希望参数使用自己的默认值,只要不传入那个参数就可以了;
void test5(int a,int b = 5,int c = 10,int d =15){ cout<<a+b+c+d<<endl; } int main(int argc,char *argv[]){ test5(5); test5(5,100); } 2.内联函数,在函数的返回类型前面加上inline就可以将这个函数声明为内联函数,声明为内联函数的函数在被调用的时候,相当于将内联函数出的代码代入调用处直接执行。 这样就可以减少部分函数调用产生的开销。但是只适用于那些调用比较频繁,并且函数中代码逻辑较简单的函数。 inline int getBiggerNum(int a,int b){ return a>b?a:b; }
3.assert预处理宏的使用,头文件#include <cassert>
使用方法assert(表达式),如果表达式为真则什么也不做,如果表达式为假则输出信息并立即终止程序
int main(int argc,char *argv[]){ assert(argc>2); cout<<"程序执行完毕!"<<endl; } 4.通过预处理变量是否定义来确定代码是否执行: #ifdef TEST//如果定义了TEST预处理变量则执行下面的代码 cout<<__func__<<endl;//打印当前函数的名称 cout<<__FILE__<<endl;//打印当前的文件名 cout<<__LINE__<<endl;//打印当前的行号 cout<<__TIME__<<endl;//打印当前的时间 cout<<__DATE__<<endl;//打印当前的日期 #endif 这里定义TEST预处理变量的方式,可以在代码前面加上#define TEST。也可以在编译的时候通过命令选项定义TEST预处理变量如:g++ test.cpp -D TEST -o test 5.指向函数的指针。 我们可以定义一个指向函数的指针: 函数本身: int add(int x,int y){ return x+y; } 定义一个上面那个函数类型的指针: int (*funPtr)(int x,int y);//定义一个指向返回值为int,参数为两个int的函数的指针funPtr funPtr = add;//给函数指针funPtr赋值让其指向上面声明的add函数 funPtr(5,6);//使用这个指向函数的指针调用函数 6.将函数指针作为函数的参数传入。 函数的参数也可以是函数的指针,将这个函数指针传入到函数内部后,函数的内部可以通过这个函数指针调用指向的函数。 int add(int x,int y){ return x+y; } int test6(int z,int (*fun)(int x,int y)){//这个函数的第二个参数是一个函数的指针 return fun(5,6) +z;//调用传入的函数 } int main(int argc,char *argv[]){ int rel = test6(7,add); cout<<rel<<endl; } 7.将函数指针作为函数的返回值使用 int add(int x,int y){ return x+y; } using FunType = int (*) (int,int);//由于函数指针类型比较长这里使用类型别名的方式为函数指针类型声明一个别名 FunType test7(){ return add; } int main(int argc,char *argv[]){ int rel = test7()(5,6);//调用test7函数返回一个函数指针,再通过这个函数指针调用指向的函数得到返回结果 cout<<rel<<endl; }