1. inline内联函数
内联函数用于替换宏,
实例:
其中宏和 ++ 连用有副作用。
- #include "iostream"
- using namespace std;
- #define MYFUNC(a, b) ((a) < (b) ? (a) : (b))
- inline int myfunc(int a, int b)
- {
- return a < b ? a : b;
- }
- int main()
- {
- int a = 1;
- int b = 3;
- //int c = myfunc(++a, b);
- int c = MYFUNC(++a, b);
- printf("a = %d\n", a);
- printf("b = %d\n", b);
- printf("c = %d\n", c);
- system("pause");
- return 0;
- }
有以下注意:
(1)必须inline int myfunc(int a, int b)和函数体的实现,写在一块
(2)内联函数在最终生成的代码中没有定义,C++编译器直接将函数体插入函数调用处,所以内联函数没有普通函数调用时的额外开销(压栈,跳转,返回),也不能取地址。
(3)内联函数由编译器处理,直接将编译后的函数体插入调用的地方,宏由预处理器处理,进行简单文本替换,没有任何编译过程。
(4)内联编译的限制:
不能存在循环语句,不能有太多判断语句,函数体不能过于庞大,不能对函数体取地址,内联声明必须在调用语句之前。
2. 默认参数
如下:
- void printAB(int x = 3)
- {
- printf("x:%d\n", x);
- }
规则:
(1)只有参数列表后面部分才可以使用默认参数。
(2)一旦在函数中使用默认参数,这个参数之后的参数都必须使用默认参数。
- //在默认参数规则 ,如果默认参数出现,那么右边的都必须有默认参数
- void printABC(int a, int b, int x = 3, int y=4, int z = 5)
- {
- printf("x:%d\n", x);
- }
- int main62(int argc, char *argv[])
- {
- printAB(2);
- printAB();
- system("pause");
- return 0;
- }
3. 函数占位参数
如下:
- int func(int a, int b, int )
- {
- return a + b;
- }
- int main01()
- {
- //func(1, 2); //可以吗?
- printf("func(1, 2, 3) = %d\n", func(1, 2, 3));
- getchar();
- return 0;
- }
函数占位参数:
(1)占位参数只有参数类型声明,而没有参数名声明
(2)一般情况下,在函数体内部无法使用占位参数。
函数占位参数与默认参数结合
- int func2(int a, int b, int = 0)
- {
- return a + b;
- }
- void main()
- {
- //如果默认参数和占位参数在一起,都能调用起来
- func2(1, 2);
- func2(1, 2, 3);
- system("pause");
- }
4. 函数重载
(1)函数重载的概念
当函数名或函数参数不同时,函数的含义不同。
(2)函数重载的判断标准
参数类型,个数、顺序
返回值不是判断标准。
(3)编译器调用函数重载的准则
将所有同名函数作为候选者
进行精准匹配实参,和默认参数匹配实参
如果失败,进行默认类型转换匹配实参。
如果失败,就失败。
匹配不能出现二义性。
(4)函数重载与函数默认参数
- //当函数默认参数遇上函数重载会发生什么
-
- int func(int a, int b, int c = 0)
- {
- return a * b * c;
- }
- int func(int a, int b)
- {
- return a + b;
- }
- //1个参数的允许吗
- int func(int a)
- {
- return a + b;
- }
- int main()
- {
- int c = 0;
- c = func(1, 2); // 存在二义性,调用失败,编译不能通过
- printf("c = %d\n", c);
- printf("Press enter to continue ...");
- getchar();
- return 0;
- }
5. 函数重载和函数指针
- /*
- 函数重载与函数指针
- 当使用重载函数名对函数指针进行赋值时
- 根据重载规则挑选与函数指针参数列表一致的候选者
- 严格匹配候选者的函数类型与函数指针的函数类型
- */
-
- int func(int x) // int(int a)
- {
- return x;
- }
- int func(int a, int b)
- {
- return a + b;
- }
- int func(const char* s)
- {
- return strlen(s);
- }
- typedef int(*PFUNC)(int a); // int(int a)
-
- int main()
- {
- int c = 0;
- PFUNC p = func;
- c = p(1);
- printf("c = %d\n", c);
- printf("Press enter to continue ...");
- getchar();
- return 0;
- }