返回 *this,尝试级联,并且不返回引用
Returning *this, attempting cascading, and not returning a reference
我有一个问题与这里提出的问题类似:"这个"级联是如何工作的?
假设我有以下代码:
#include <iostream>
using namespace std;
class Time
{
public:
Time( int = 0, int = 0, int = 0 );
Time setHour( int );
Time setMinute( int );
void print( void );
private:
int hour;
int minute;
};
Time::Time(int hr, int mn, int sc)
{
hour = hr;
minute = mn;
}
void Time::print( void )
{
cout << "hour = " << hour << endl;
cout << "minute = " << minute << endl;
}
Time Time::setHour( int h )
{
hour = ( h >= 0 && h < 24 ) ? h : 0;
return *this;
}
Time Time::setMinute( int m )
{
minute = ( m >= 0 && m < 60 ) ? m : 0;
return *this;
}
int main()
{
cout << "Hello, world!" << endl;
Time t;
t.setHour( 10 ).setMinute( 25 );
t.print();
}
很明显,函数 setMinute( 25 ) 没有在 Time 对象 t 上运行。请注意,函数 setHour 和 setMinute 不返回对 Time 对象的引用。
t.setHour( 10 ) 执行后会发生什么?函数 setHour 是否以某种方式返回对象 t 的"副本",并且 setMinute( 25 ) 正在副本上运行?我已经用-wall编译了程序,没有返回任何错误或警告。
感谢您的帮助。
你的分析似乎是正确的。此表达式
t.setHour( 10 )
返回一个临时Time
对象。然后,您暂时致电setMinute(25)
。这反过来又返回另一个临时Time
对象,该对象未分配给任何内容。因此,setHour()
作用于t
实例,但setMinute()
作用于临时实例,该实例在此行末尾消失
t.setHour( 10 ).setMinute( 25 );
t
的每个方法都返回对 t 的引用。引用是别名。所以如果你这样做了
Time t;
Time& tAgain = t;
tAgain.setMinute( 25);
tAgain.setMinute also alters t's time.
现在将这个简单的例子推断为级联。t 的每个方法都返回对自身的引用
Time &Time::setSecond( int s )
{
second = ( s >= 0 && s < 60 ) ? s : 0;
return *this;
}
所以在表达式中:
t.setHour( 10 ).setMinute( 25 )
t.setHour( 10 )
在 t 上调用 setHour,然后返回对 t 的引用。在这种情况下,引用是临时的。因此,您可以将其视为在评估setHour时将上述行更改为以下内容:
tAgain.setMinute(25);
t.setHour
返回了一个引用 - 类似于我们上面的tAgain。只是 t 本身的别名。
相关文章:
- 寿命延长从函数返回引用
- 了解C++如何返回引用并绑定到引用
- 返回引用实例和非引用实例(return mystr & vs mystr)之间的区别是什么?
- 从类返回引用向量
- 使用unique_ptr并返回引用,或者我应该使用shared_ptr并在需要时制作副本
- 混淆C++从函数返回引用
- 两个相同的重载运算符[]一个返回引用
- 为什么向量的.at()成员函数返回引用而不是迭代器
- C++使用和返回引用
- 返回 T 引用的 Const 函子禁止赋值
- 返回引用是否也会延长其生存期?
- 如何返回引用,然后递增迭代器
- 如果使用返回引用的函数初始化"auto"var,为什么它不声明引用类型?
- 我是否需要将 ref 与 make_pair 一起使用才能返回引用?
- 在 vector::at 返回引用后进行更改
- 为什么PyImport_ImportModule返回引用计数为 3 而不是 1 的 PyObject*
- 超出返回引用的单一实例生存期
- Boost.Python 返回引用现有 c++ 对象的 python 对象
- C++ 运算符 += 重载返回引用
- 如何声明接受转发引用并返回引用或副本的函数模板