c++引用作为参数和返回值小结

来源:互联网 发布:java uml建模工具 编辑:程序博客网 时间:2024/06/05 11:20

引用作为函数参数通常出于2点原因
1.函数内需要修改 传参的值
值的传递机制是通过“形参=实参”
来对形参赋值达到传值目的,产生了一个实参的副本。即使函数内部有对参数的修改,也只是针对形参,也就是那个副本,实参不会
有任何更改。函数一旦结束,形参生命也宣告终结,做出的修改一样没对任何变量产生影响。
2.处于优化资源利用的考虑
形参传递的是一个对象 用值传递会调用拷贝构造函数 函数声明为引用则可以避免这次消耗能提高代码的效率
引用作为返回值
说明:

格式: 类型标识符 &函数名(形参列表及类型说明){//函数体}

好处:在内存中不产生返回值的副本(返回一个局部变量的引用是不可取的,因为随着局部变量生存周期的结束,相应的引用也会失效,产生runtime error)

注意:
1.不能返回局部变量的引用,局部变量会在函数返回后被销毁。
2.不能返回函数内部new分配的内存的引用,虽然不存在局部变量的被动销毁问题,但是函数返回的引用只是作为一个临时变量出现,并没有被赋予一个实际的变量,导致引用所指向的空间无法释放。
3.可以返回类成员的引用,但最好是const,主要原因是当对象的属性与某种业务规则相关联的时候,其赋值常常与某些其它属性或者对象的状态相关联,因此有必要将赋值操作封装在一个业务规则中,如果其它对象可以获得该属性的非常量引用(或指针),那么对于该属性的单纯赋值就会破坏业务规则的完整性。

这里用point & operator = (const point &rhs)赋值运算符函数作为例子
引出另一个好处
返回值的类型声明为类的引用,并在函数结束前返回实例自身的引用(即*this)。只有返回一个引用,才可以允许连续赋值。否则,如果函数的返回值是void,那么这个赋值运算符不能连续赋值,假设有3个String对象:str1, str2, str3, 在程序语句中str1 = str2 =str3将不能通过编译

最后附上 引用传递 值传递 指针传递 区别
值传递:
形参是实参的拷贝,改变形参的值并不会影响外部实参的值。从被调用函数的角度来说,值传递是单向的(实参->形参),参数的值只能传入,
不能传出。当函数内部需要修改参数,并且不希望这个改变影响调用者时,采用值传递。
指针传递:
形参为指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行的操作
引用传递:
形参相当于是实参的“别名”,对形参的操作其实就是对实参的操作,在引用传递过程中,被调函数的形式参数虽然也作为局部变量在栈
中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过
栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量。