day02C++--内联函数,默认参数,函数占位参数,函数重载,函数重载和函数指针结合

内联函数

  • 内敛函数的说明(这个我没弄懂)
  • 说明1:

必须inline int myfunc(int a, int b)和函数体的实现,写在一块

  • 说明2

C++编译器可以将一个函数进行内联编译
被C++编译器内联编译的函数叫做内联函数
内联函数在最终生成的代码中是没有定义的
C++编译器直接将函数体插入在函数调用的地方
内联函数没有普通函数调用时的额外开销(压栈,跳转,返回)

  • 说明3:C++编译器不一定准许函数的内联请求!
  • 说明4

内联函数是一种特殊的函数,具有普通函数的特征(参数检查,返回类型等)
内联函数是对编译器的一种请求,因此编译器可能拒绝这种请求
内联函数由 编译器处理,直接将编译后的函数体插入调用的地方
宏代码片段 由预处理器处理, 进行简单的文本替换,没有任何编译过程
说明5:
现代C++编译器能够进行编译优化,因此一些函数即使没有inline声明,也可能被编译器内联编译
另外,一些现代C++编译器提供了扩展语法,能够对函数进行强制内联
如:g++中的__attribute__((always_inline))属性
说明6:
C++中内联编译的限制:
不能存在任何形式的循环语句
不能存在过多的条件判断语句
函数体不能过于庞大
不能对函数进行取址操作
函数内联声明必须在调用语句之前
编译器对于内联函数的限制并不是绝对的,内联函数相对于普通函数的优势只是省去了函数调用时压栈,跳转和返回的开销。
因此,当函数体的执行开销远大于压栈,跳转和返回所用的开销时,那么内联将无意义。
结论:
1)内联函数在编译时直接将函数体插入函数调用的地方
2)inline只是一种请求,编译器不一定允许这种请求
3)内联函数省去了普通函数调用时压栈,跳转和返回的开销

宏的例子:
#define MYFUNC(a,b) (a<b?a:b)
int main()
{
//printA();

int a = 1;
int b = 3;
int c = MYFUNC(++a, b);
cout << a << endl;
cout << b << endl;
cout << c << endl;

system("pause");
return 1;

}// 执行结果 a=3,b=3,c=3

默认参数

/*1
C++中可以在函数声明时为参数提供一个默认值,
当函数调用时没有指定这个参数的值,编译器会自动用默认值代替
例子:
void myPrint(int x = 3)
{
printf(“x:%d”, x);
}
int main()
{
myPrint(2);
myPrint(); //两个都能编译通过。

}
//在默认参数规则 ,如果默认参数出现,那么右边的都必须有默认参数
void printABC(int a, int b, int x = 3, int y=4, int z = 5)
{
printf(“x:%d\n”, x);
}

函数占位参数

函数占位参数
占位参数只有参数类型声明,而没有参数名声明
一般情况下,在函数体内部无法使用占位参数
void fun(int a,int b,int =0)
{
cout << a << b << endl;

}

int main()
{
//printA();
fun(1, 2, 4);
system(“pause”);
return 1;
}

函数重载

1 函数重载概念
函数重载(Function Overload)
用同一个函数名定义不同的函数
当函数名和不同的参数搭配时函数的含义不同
2 函数重载的判断标准
/*
函数重载至少满足下面的一个条件:
参数个数不同
参数类型不同
参数顺序不同
*/
3 函数返回值不是函数重载的判断标准
例子:

void fun(int a,int b,int =0)
{
cout << a << b << endl;
}
void fun1(int a)
{
cout << a << endl;
}
void fun2(int *a)
{
cout << a << endl;
}
void fun3(int a,int b)
{
cout << a << b<<endl;
}
上面属于函数重载。

函数重载和函数指针结合

void fun1(int a,int b)
{
cout << a << b<<endl;
}

//函数指针的基础语法
typedef void (myTypeFun)(int a, int b);//自定义数据类型
typedef void (*mytTypeFun)(int a, int b);//自定义数据类型
// 函数指针,
//声明一个函数类型
//声明一个函数指针类型
//声明一个函数类型
int main()
{
//printA();
myTypeFun *t = NULL; //定义一个数据类型,指向函数入口地址。
// mytTypeFun t = NULL;
t = fun1;
t(1, 2); //输出 1,2
system(“pause”);
return 1;
}

后面讲(函数重载、重写、重定义 )

重载是一个面试频率很高的知识点。

猜你喜欢

转载自blog.csdn.net/weixin_43916755/article/details/88085184