关于C++中类成员函数返回值的疑问
在《标准C++宝典》中有一个例子,下面是其中的一部分:Date&operator=(constDate&dt){ndays=dt.ndays;return*this;}D...
在《标准C++宝典》中有一个例子,下面是其中的一部分:
Date& operator = (const Date& dt)
{
ndays = dt.ndays;
return *this;
}
Date operator + (int n)const
{
Date dt(*this);
dt += n;
return dt;
}
对于这个例子,我有两个疑问,请高手帮忙解答一下:
(1)一个返回的是Date类的临时对象,一个返回的是Date类对象的引用,这两种返回值有什么区别?在什么情况下应该返回引用,什么情况下应该直接返回对象?
(2)对于返回临时对象的那个例子,dt是一个局部变量,生存周期应该只在函数调用中。在函数退出时,该变量应该会被销毁。那么这种情况下,这个函数如何把返回值传递给被调函数?(我记得C语言中不能返回函数内部的局部数组变量也是这样的原因,何以C++这里可以这样返回?)
答案补充:
(1)1. 能返回引用的地方一般是要求被返回的对象不是临时对象。如果你返回的对象满足这个条件,就可以返回引用,operator+显然不满足这个条件
(2)虽然dt是一个零时变量,但是在return的时候调用了Data的拷贝构造函数
重新构造了一个_dt作为返回值,dt被销毁了,但是他的副本被返回了,所以这里没有问题。所以在构造Data的时候我们要显示的声明一个拷贝构造函数。 展开
Date& operator = (const Date& dt)
{
ndays = dt.ndays;
return *this;
}
Date operator + (int n)const
{
Date dt(*this);
dt += n;
return dt;
}
对于这个例子,我有两个疑问,请高手帮忙解答一下:
(1)一个返回的是Date类的临时对象,一个返回的是Date类对象的引用,这两种返回值有什么区别?在什么情况下应该返回引用,什么情况下应该直接返回对象?
(2)对于返回临时对象的那个例子,dt是一个局部变量,生存周期应该只在函数调用中。在函数退出时,该变量应该会被销毁。那么这种情况下,这个函数如何把返回值传递给被调函数?(我记得C语言中不能返回函数内部的局部数组变量也是这样的原因,何以C++这里可以这样返回?)
答案补充:
(1)1. 能返回引用的地方一般是要求被返回的对象不是临时对象。如果你返回的对象满足这个条件,就可以返回引用,operator+显然不满足这个条件
(2)虽然dt是一个零时变量,但是在return的时候调用了Data的拷贝构造函数
重新构造了一个_dt作为返回值,dt被销毁了,但是他的副本被返回了,所以这里没有问题。所以在构造Data的时候我们要显示的声明一个拷贝构造函数。 展开
3个回答
展开全部
问题1:返回Date临时对象的时候,会在内存中临时创建一个Date对象,这个对象是临时性的,当所在的语句结束之后就会被收回,就是不能再用了。而返回Date类对象的引用的时候,返回的是该对象本身。
比如你的第一个函数,返回的是this对象本身,所以可以对其进行操作,比如可以这样操作:dateA = dateB = dateC; //这三个对象都是Date类型,=运算符从右边开始往左运算,首先将dateC赋值给dateB,然后返回dateB本身(因为函数返回的是对*this的引用),然后将dateB赋值给dateA,返回dateA本身。
问题2:在函数结束的时候dt确实是被销毁了,但是在销毁之前,会在内存中临时创建一个Date对象(创建的类型要看返回类型,这里返回是的Date类型,所以临时创建的对象也是Date类型),然后将dt赋值给该临时对象,然后dt就会被销毁了。所以最后传递的值是这个临时对象。这个临时对象的寿命也是很短的,所在语句结束之后就不能用了。
比如你的第一个函数,返回的是this对象本身,所以可以对其进行操作,比如可以这样操作:dateA = dateB = dateC; //这三个对象都是Date类型,=运算符从右边开始往左运算,首先将dateC赋值给dateB,然后返回dateB本身(因为函数返回的是对*this的引用),然后将dateB赋值给dateA,返回dateA本身。
问题2:在函数结束的时候dt确实是被销毁了,但是在销毁之前,会在内存中临时创建一个Date对象(创建的类型要看返回类型,这里返回是的Date类型,所以临时创建的对象也是Date类型),然后将dt赋值给该临时对象,然后dt就会被销毁了。所以最后传递的值是这个临时对象。这个临时对象的寿命也是很短的,所在语句结束之后就不能用了。
展开全部
1 如果你在这次使用之后还要继续使用这个对象,那么就返回引用,比如连续输出<< ,他返回那个输出流的引用,所以你连续使用时的结果就是在同一个输出流中输出东西 cout<<1<<2<<3;
如果你只需要这个值的话,那么就不用返回引用,普通返回就可以,他返回的是一个复制的对象
2 人家说的是不能返回局部对象的·引用· ,而不是不能返回局部对象。
返回局部对象实际上是复制一个局部对象,并返回,return dt 就是复制一个dt,并返回这个复制的值
如果函数是这样 的 Date& operator + (int n)const ,这个返回值是个引用
那么 return dt;就是错的
如果你只需要这个值的话,那么就不用返回引用,普通返回就可以,他返回的是一个复制的对象
2 人家说的是不能返回局部对象的·引用· ,而不是不能返回局部对象。
返回局部对象实际上是复制一个局部对象,并返回,return dt 就是复制一个dt,并返回这个复制的值
如果函数是这样 的 Date& operator + (int n)const ,这个返回值是个引用
那么 return dt;就是错的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
(1) 返回对象和引用主要的区别在于引用可以再次进行操作修改,而返回的对象则属于是一个临时对象,一会就没了,不能再修改,只能用来给别人进行赋值或者比较
(2) + 这个函数的返回值是一个 Date型的,返回的时候相当于是复制了dt然后传出去的,你可以理解成每个函数的返回值都有一个自己的在外层看来是只读的空间.就跟返回int型一样,是可以的
(2) + 这个函数的返回值是一个 Date型的,返回的时候相当于是复制了dt然后传出去的,你可以理解成每个函数的返回值都有一个自己的在外层看来是只读的空间.就跟返回int型一样,是可以的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询