c++引用作为参数和返回值小结
2017-06-07 16:31
309 查看
引用作为函数参数通常出于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将不能通过编译
最后附上 引用传递 值传递 指针传递 区别
值传递:
形参是实参的拷贝,改变形参的值并不会影响外部实参的值。从被调用函数的角度来说,值传递是单向的(实参->形参),参数的值只能传入,
不能传出。当函数内部需要修改参数,并且不希望这个改变影响调用者时,采用值传递。
指针传递:
形参为指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行的操作
引用传递:
形参相当于是实参的“别名”,对形参的操作其实就是对实参的操作,在引用传递过程中,被调函数的形式参数虽然也作为局部变量在栈
中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过
栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量。
1.函数内需要修改 传参的值
值的传递机制是通过“形参=实参”
来对形参赋值达到传值目的,产生了一个实参的副本。即使函数内部有对参数的修改,也只是针对形参,也就是那个副本,实参不会
有任何更改。函数一旦结束,形参生命也宣告终结,做出的修改一样没对任何变量产生影响。
2.处于优化资源利用的考虑
形参传递的是一个对象 用值传递会调用拷贝构造函数 函数声明为引用则可以避免这次消耗能提高代码的效率
引用作为返回值
说明:
格式: 类型标识符 &函数名(形参列表及类型说明){//函数体}
好处:在内存中不产生返回值的副本(返回一个局部变量的引用是不可取的,因为随着局部变量生存周期的结束,相应的引用也会失效,产生runtime error)
注意:
1.不能返回局部变量的引用,局部变量会在函数返回后被销毁。
2.不能返回函数内部new分配的内存的引用,虽然不存在局部变量的被动销毁问题,但是函数返回的引用只是作为一个临时变量出现,并没有被赋予一个实际的变量,导致引用所指向的空间无法释放。
3.可以返回类成员的引用,但最好是const,主要原因是当对象的属性与某种业务规则相关联的时候,其赋值常常与某些其它属性或者对象的状态相关联,因此有必要将赋值操作封装在一个业务规则中,如果其它对象可以获得该属性的非常量引用(或指针),那么对于该属性的单纯赋值就会破坏业务规则的完整性。
这里用point & operator = (const point &rhs)赋值运算符函数作为例子
引出另一个好处
返回值的类型声明为类的引用,并在函数结束前返回实例自身的引用(即*this)。只有返回一个引用,才可以允许连续赋值。否则,如果函数的返回值是void,那么这个赋值运算符不能连续赋值,假设有3个String对象:str1, str2, str3, 在程序语句中str1 = str2 =str3将不能通过编译
最后附上 引用传递 值传递 指针传递 区别
值传递:
形参是实参的拷贝,改变形参的值并不会影响外部实参的值。从被调用函数的角度来说,值传递是单向的(实参->形参),参数的值只能传入,
不能传出。当函数内部需要修改参数,并且不希望这个改变影响调用者时,采用值传递。
指针传递:
形参为指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行的操作
引用传递:
形参相当于是实参的“别名”,对形参的操作其实就是对实参的操作,在引用传递过程中,被调函数的形式参数虽然也作为局部变量在栈
中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过
栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量。
相关文章推荐
- C++引用(作为函数参数和返回值)
- ”引用 & 指针“ -- 作为函数的参数和返回值小结
- c++关于类型强转后作为引用参数的一些问题
- [转]c++中临时变量不能作为非const的引用参数
- C#调用c++的dll,结构体数组作为引用参数的传递方式
- c++引用参数与引用返回值
- C++中,引用作为函数参数
- C++引用参数和引用返回值
- c++将引用或者是指针作为函数参数实现实参的运算
- C++引用参数和引用返回值
- C++引用作为返回值
- c++中临时变量不能作为非const的引用参数
- c++中临时变量不能作为非const的引用参数
- C#调用C++ 平台调用P/Invoke 结构体--输入输出参数、返回值、返出值、结构体数组作为参数【五】
- c++中临时变量不能作为非const的引用参数
- C++结构体作为函数参数(值和引用)和返回值
- C++ 引用和指针作为函数参数的例子。请不要拍砖
- C++函数参数和返回值三种传递方式:值传递、指针传递和引用传递(着重理解)
- extern修饰的变量是全局的吗?-----应该是吧!引用可以作为返回值,但输入参数最后也是引用。
- C++常量引用作为函数参数的例子