文档章节

引用作为返回值

yintao
 yintao
发布于 2014/05/09 12:38
字数 734
阅读 41
收藏 0

用引用作为返回值的情况(返回值作为左值):

  1. 函数形参为引用,函数要返回形参时,要用引用

  2. 类成员函数要返回自身时,要用引用

  3. 返回全局变量,可以用引用

不能用引用作为返回值的情况(返回值只作为右值):

  1. 返回局部变量时


eg:

用引用作为返回值:

1. friend istream& operator >> (istream & in,A& a);

2. A& operator ++ () { ++(this->ele); return *this; }//前缀++重载        A& operator = (const A& a) { this->ele = a.ele; return *this; } //赋值运算符重载

不能用引用作为返回值:

  1. A operator ++ (int) { A tmp=*this; ++(*this); return tmp; }



再说一下引用作为返回值与值返回的区别:

引用作为返回值:返回的是地址

值返回:编译器额外定义一个临时变量,以返回的值初始化,然后此临时变量被其他变量或表达式访问


在这里可能有人要问了为什么不能返回局部变量的引用,因为函数在返回之后局部变量都释放了,如果返回引用会访问到未定义区域。请看下面

函数返回时的过程是这样的:

函数计算完毕,执行到return语句时,会在内存中自动定义一个返回值类型的临时变量以return的值初始化,之后函数执行完毕,局部变量释放,注意此时临时变量还存在!然后用户根据需要访问或者不访问临时变量,等到执行下一条语句,临时变量自动销毁。

以下是例证:

vs2010

#include <iostream>
using namespace std;
class A
{
public:
 A()
 {
 cout<<"无参构造函数"<<endl;
 }
 A(const A& a)
 {
 cout<<"拷贝构造函数"<<endl;
 }
 A& operator = (const A& a)
 {
 cout<<"赋值运算符重载"<<endl;
 return *this;
 }
 ~A()
 {
 cout<<"析构函数"<<endl;
 }
private:
};

const A boo(const A a)
{
 cout<<"A tmp = a"<<endl;
 A tmp = a;//调用拷贝构造函数
 cout<<"return tmp"<<endl;
 return tmp;//外部会自动定义一个临时变量,以tmp初始化,所以调用拷贝构造函数
}

int main(int argc,char* argv[])
{
 cout<<"A a"<<endl;
 A a;//调用无参构造函数
 cout<<"A b(a)"<<endl;
 A b(a);//调用拷贝构造函数
 cout<<"-----------------------------------------------"<<endl;
 b=boo(a);//当把a值传递给形参时,会调用拷贝构造函数;返回时,会定义临时变量以函数内返回值初始化
 system("pause");
 return 0;
}

执行结果:

A a

无参构造函数

A b(a)

拷贝构造函数

-----------------------------------------------

拷贝构造函数    //定义形参以实参初始化

A tmp = a

拷贝构造函数    //定义tmp以a初始化

return tmp

拷贝构造函数    //定义临时变量以返回值初始化

析构函数            //局部变量tmp析构

析构函数            //形参a析构

赋值运算符重载    //b=临时变量

析构函数            //临时变量析构销毁

请按任意键继续. . .


© 著作权归作者所有

上一篇: ++重载
下一篇: 运算符重载
yintao
粉丝 7
博文 63
码字总数 45783
作品 0
大连
程序员
私信 提问
C++ 引用的作用和用法

C++ 引用的作用和用法 引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。 引用的声明方法:类型标识符 &引用名=目标变量名; 【例1】:int a; int &ra=a; //定义...

allenchan3721
2014/05/12
0
0
Android NDK开发之旅19--C++--引用

C++ 引用 引用变量是一个别名,也就是说,它是某个已存在变量的另一个名字。一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量。 C++ 引用 vs 指针 引用很容易与指针混...

香沙小熊
2017/11/17
0
0
C#7.0--引用返回值和引用局部变量

  一、在C#7.0以上版本中,方法的返回值可以通过关键字ref指定为返回变量的引用(而不是值)给调用方,这称为引用返回值(Reference Return Value,或ref returns);   1.与引用参数一样...

Minotauros
01/23
0
0
C#7.2——编写安全高效的C#代码

原文地址:https://docs.microsoft.com/zh-cn/dotnet/csharp/write-safe-efficient-code?view=netcore-2.1 值类型的优势能避免堆分配。而劣势就是往往伴随的数据的拷贝。这就导致了在大量的值...

沉睡的木木夕
2018/11/07
0
0
Python自学笔记之函数式编程5——返回函数

函数作为返回值 高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回。 要实现一个可变参数的求和,通常函数是这样定义的: def calc_sum(*args): ax = 0 for n in args: ax = ...

twobeings
2015/07/21
117
0

没有更多内容

加载失败,请刷新页面

加载更多

好程序员大数据学习路线分享函数+map映射+元祖

好程序员大数据学习路线分享函数+map映射+元祖,大数据各个平台上的语言实现 hadoop 由java实现,2003年至今,三大块:数据处理,数据存储,数据计算 存储: hbase --> 数据成表 处理: hive --> 数...

好程序员官方
今天
6
0
tabel 中含有复选框的列 数据理解

1、el-ui中实现某一列为复选框 实现多选非常简单: 手动添加一个el-table-column,设type属性为selction即可; 2、@selection-change事件:选项发生勾选状态变化时触发该事件 <el-table @sel...

everthing
今天
6
0
【技术分享】TestFlight测试的流程文档

上架基本需求资料 1、苹果开发者账号(如还没账号先申请-苹果开发者账号申请教程) 2、开发好的APP 通过本篇教程,可以学习到ios证书申请和打包ipa上传到appstoreconnect.apple.com进行TestF...

qtb999
今天
10
0
再见 Spring Boot 1.X,Spring Boot 2.X 走向舞台中心

2019年8月6日,Spring 官方在其博客宣布,Spring Boot 1.x 停止维护,Spring Boot 1.x 生命周期正式结束。 其实早在2018年7月30号,Spring 官方就已经在博客进行过预告,Spring Boot 1.X 将维...

Java技术剑
今天
17
0
浅谈java过滤器Filter

一、简介 Servlet中的过滤器Filter是实现了javax.servlet.Filter接口的服务器端程序,主要的用途是过滤字符编码、做一些业务逻辑判断如是否有权限访问页面等。其工作原理是,只要你在web.xml...

青衣霓裳
今天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部