函数默认值和内联函数_吃鱼的小脸猫_新浪博客

一、函数默认值

       1.定义:

          我们可以赋予函数参数默认值。所谓默认值就是在调用时,可以不写某些参数的值,编译器会自动把默认值传递给调用语句中。默认值可以在声明或定义中 设置;也可在声明或定义时都设置,都设置时要求默认值是相同的。

       2.函数默认值的特性

          (1)默认参数在函数声明中提供,当又有声明又有定义时,定义中不允许默 认参数,如果函数中只有定义,则默认参数才可以出现在函数定义中。

             例如:

                        void point(int=3,int=4); //声明中给出默认值
                 void point(intx,inty) //定义中不允许再给出默认值
                {
                  cout <<x<<endl;
                  cout <<y<<endl;
                 }

          (2)如果一个函数中有多个默认参数,默认参数传参的顺序是从右向左,匹配是从左向右;

                例如:

           void func(int a=1,int b,int c=3, int d=4); //error
               void func(int a, int b=2,int c=3,int d=4); //true
                  对于第2个函数声明,其调用的方法规定为:

            func(10,15,20,30); //true:调用时给出所有实参
             func(); //error:参数a没有默认值
             func(i2,12); //true:参数c和d默认
             func(2,15,20); //error:只能从右到左顺序匹配默认

          (3)默认值的限定:默认值可以是全局变量、全局常量、函数;

             例如:

                int a=1;
              int fun(int);
              int g(int x;fun(a)); //ok:允许默认值为函数

             默认值不可以是局部变量,因为默认参数的函数调用实在编译期间确定的,局部变量的位置和值在编译期间是无法确定的。

例如:
  void fun()
  {
    int i;
    void g(int x=i); //error:处理g()函数声明时,i不可见
  }

       3.函数默认值的设计

          (1)函数默认值自右向左一次性设计

          (2)默认值不能重复赋值

二、inline修饰的函数 (内联函数)

        1.特点:

         (1)在函数调用点之间(在编译期间)展开,不生成符号;

         (2)内联只是编译器的建议;

         (3)在debug版本下不生效,只在release下生效

         (4)针对递归,系统一定不会使用内联函数,因为无法确定递归的深度

        2.优点:

            没有函数开栈和清栈的开销;

        3.缺点:

         (1)目标代码太大

         (2)编译时间太长

        4.当函数执行的开销 < 函数开栈的开销(即函数体较小的),选择内联函数。

        5.内联函数的区别

         (1)与普通函数的区别:

                 a.内联函数是代码被插入到调用者代码处的函数

                 b.内联函数在编译时,对每次调用都生成一个副本,运行时,内联函数直接展开(类似宏)即可运行。

                    普通函数编译时,只生成一个副本,在运行时,需进行一些进栈出栈操作来调用函数,和初始化参数。

                  c.内联函数占用内存大,效率高,普通函数占用内存小,效率低

            (2)与宏的区别:

                      内联函数编译期间处理,有类型和安全检查,且可调试;

                       宏在预编译期间处理,无类型和安全检查,不可调试;

            (3)与static修饰的函数的区别:

                     内联函数不生成函数符号;

                     static修饰的函数是在编译期间生成符号,保证本文件可见;

        

        

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值