稻草人的程序之路--函数参数中非引用,引用和const限定符的使用.
来源:互联网 发布:java包的命名规范 知乎 编辑:程序博客网 时间:2024/05/18 00:49
关于函数的参数传递,我们在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让函数直接访问实参对象,无须复制后再使用。
当然了,如果你需要通过函数来修改实参的值,那么也建议你使用引用类型来定义形参,理由就和前面说的一样。引用类型还是有很多好处,除了减轻程序的负担,还可以完成我们调用一个函数需要返回两个或者多个返回值的情形。具体的应用 就是 指定一个值作为返回值,其他需要返回的值,用引用来修改实参。
- 稻草人的程序之路--函数参数中非引用,引用和const限定符的使用.
- 关于const限定符和const引用的讨论
- const类型参数的对象引用和const成员函数
- C++ const限定符之顶层const & 底层const & 指针 & 引用之间的关系
- 声明和定义变量、const限定符和引用、简单的类类型需注意点
- C++的const限定符对引用和指针的作用
- 关于两种复合类型--引用和指针以及const常量限定符的一些总结
- [第二节]C++ 引用 函数调用作为左值 用const限定引用 返回堆中变量的引用
- 函数返回const引用和普通引用的区别
- 函数传递const和非const非引用参数的笔记 - 20150905
- 常引用,const引用的案例,以及常引用作函数参数
- 函数参数中const 引用 和 传值
- const 限定符、const引用、const指针,顶层const和底层const
- C++查缺补漏之const限定符及引用
- 用const限定引用
- 多层函数参数非const引用潜在的危险
- const引用做形参---函数参数的传递,并不都是复制
- 函数的输入参数引用为什么要加const
- Facebook App Center开张 移动版同时发布
- 语法总结
- SQL Server 2008 R2数据库镜像部署
- This attribute must be localized.错误解决方式
- org.apache.jasper.JasperException jstl错误
- 稻草人的程序之路--函数参数中非引用,引用和const限定符的使用.
- 面向对象设计原则--面试遭遇
- ASP.NET2.0 CheckBoxList组件编程浅析
- 2012.6.8
- poj 3650 The Seven Percent Solution
- poj 3650 The Seven Percent Solution
- 取消Firefox Flash debug player调试时超时机制
- 视频编解码概述
- 印制电路板