函数默认值,内联函数和函数的重载

  • 函数的默认值
  1. 实参匹配形参时从左向右匹配,但是从右向左依次赋默认值。
  2. 函数默认值不能重复复制

例如:①:int fun(int a,int b,int c=30);

                  int fun(int a,int b,int c=30)

                 {

                       return a+b+c;

                 }

             在声明时给定默认值,在定义时仍然给默认值,当给出的两个默认值不同时导致编译器在编译时无法确定使用哪个默认值,所以报错。

           ②:在下图情况中由于从左向右匹配,从右向左复制的的原因,导致虽然提示有错误但是仍然可以运行 

         ③但是在一个.cpp文件中声明   int fun(int a,int b,int c=30);

                    在另外一个文件中调用时仍然给c再次给默认值编译时并不会出错

             对于①而言是因为一个文件中相同指令重复生成,但是在同一个文件中,能看到会报错

             但不同文件中每个文件都会有自己的符号表,未链接时互相看不到对方文件中的符号。

  • 内联函数(inline)
  1. 内联函数的特点:在函数调用点展开。
  2. 由内联函数的特点我们可以想到宏函数:在宏函数中(1)不存在栈帧的开辟(2)不存在参数的代入(3)不存在返回值的带出(4)不存在参数的清除。但是因为宏函数在预编译期间实现替换导致宏函数无类型检查和安全检查,且不可以调试。
  3. 内联函数的使用情况:函数执行的开销<函数开栈的开销
  4. inline只是对编译器的一个建议,编译器会针对具体情况考虑是否采用。
  5. 内联函数不一定会展开,例如对于递归函数,一定不会使用内联处理,因为在编译期间无法确定递归的深度(编译期间无法知道值,运行时才会根据地址去拿值)。
  6. 内联函数,static函数与宏函数比较

  • 函数的重载

1.c语言中符号生成依靠函数名,出现同名时会先判断强弱符号,如果同为强则报错

2.c++中符号生成依靠函数名和参数列表组成符号,返回值不参与重载

3.函数重载规则:函数名必须相同,参数个数、类型和排列顺序必须有不同,函数的返回值类型可以相同也可以不同,仅仅返回值类型不同不足以构成重载。

阅读更多

没有更多推荐了,返回首页