稻草人的程序之路--函数参数中非引用,引用和const限定符的使用.

关于函数的参数传递,我们在C/C++中或多或少有些认识和了解。但对很多刚接触程序的新人来说,都没有真正的搞懂形参有哪些类型,又分别扮演什么用的角色,这里我简单的做一个慨括。
         函数的参数,形参可以分为两大类,一种是非引用形参,另一种就是引用形参。那么什么是非引用形参什么是引用形参呢,就是函数在定义形参的时候指定了实参带入函数时将使用地址值来操作,如:int value(int &v1, int &v2);这样的定义,函数在调用时,形参不作为实参的副本来复制实参的值,而是函数直接通过V1地址来使用V1的值,在调用函数中能够修改实参的值。
        而非引用类型呢?我们举个例子:
            int gcd( int v1, int v2)
            {
                v2 = v2*5 ;
                v1 = v2%2 ;
                return v1 ;
            }
           这里,函数gcd虽然修改了v1的值,但是这些变化仅限于局部的参数,也就是说,只有在gcd函数里面有效,而对于作为调用函数gcd使用的实参没有任何影响,通俗的说,如果gcd是在main函数中调用的v1,v2那么main函数中v1和v2的值不变,那么这样的函数参数定义就叫做普通非引用形参。为什么说普通非引用类型呢?有经验的同学应该会想到, 将函数形参定义为指针也能在调用函数里面改变实参的值,是的,而指针不也是非引用类型,所以只有普通的非引用类型调用函数才不会修改实参的值。
            可能你会问,既然指针可以改变实参的值,那么我们为什么还要用引用来改变实参的值,能这样想的话,你的思维还是很活跃的。我们用指针来修改实参的值,只要是非引用类型,都要先将实参的值复制给形参的值,如果形参的数据量小,程序简单那是可以用指针的。但是如果实参的数据量大,有几百万个数据,如果每次调用函数访问实参时都需要用形参复制一次实参而且函数的调用率高,那么程序运行就慢,处理器的负载也高,浪费内存的使用。而使用引用的话,前面我们说过,函数是通过实参的地址来访问实参,不需要复制实参的操作,减轻程序的运行负担,不需要付出时间和存储空间的代价。这里要注意的是,即使你不对实参进行修改,只有调用了实参,而且是使用非引用类型的形参,那么都是要通过复制操作来使形参获得实参的值。
            这里就会出现新问题,可能你想用引用类型来定义形参,但是引用是会导致函数修改形参时实参修改的,就算你不想修改实参。这时候,我们还是有办法的,那就是const限定符。
            什么是const限定符,它 要求程序在定义一个const类型的变量时不能在初始化后再改吧其值,那么,在函数的形参中,形参为引用类型,且定义为const则防止函数修改实参,这就是利用const引用类型避免复制和函数修改实参。即,const和引用类型配合,完成了不需要复制实参又可以防止实参在函数中被修改的好处。而在定义const为形参的时候,我们要注意,函数的形参若为的const的引用,则可以调用非const和const的实参,反之则不行。
            我们定义一个用来处理string类型的数据的函数来示例:
            string IsFullString(const string &s1, const string &s2)
            {
                    return  s1 = s1 + s2 ;
            }    
            该函数将两个string连接成的新字符串复制给s1,并返回s1;该函数不会修改s1的值。因为const防止函数修改string的值,而&s1让函数直接访问实参对象,无须复制后再使用。
            当然了,如果你需要通过函数来修改实参的值,那么也建议你使用引用类型来定义形参,理由就和前面说的一样。引用类型还是有很多好处,除了减轻程序的负担,还可以完成我们调用一个函数需要返回两个或者多个返回值的情形。具体的应用 就是 指定一个值作为返回值,其他需要返回的值,用引用来修改实参。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值