Clock Clock::operator++(int x)
{
Clock oldState= *this;
tick();
return *oldState;
}
运算符重载函数创建一个指向* this的对象oldState。那是什么意思?它是否将本地对象的地址分配给oldState?或者是使用=运算符重载(调用复制构造函数)。它做了什么?
并返回* oldState,不会超出范围,因为你没有在堆上声明它吗?
答案 0 :(得分:4)
首先是这段代码
Clock Clock::operator++(int x)
{
Clock oldState= *this;
tick();
return *oldState;
}
无效,因为返回的表达式无法转换为Clock类型。返回表达式的类型为Clock *而不是Clock。正确的运算符可以采用以下方式
Clock Clock::operator++( int )
{
Clock oldState= *this;
tick();
return oldState;
}
本声明
Clock oldState= *this;
表示使用应用于原始对象的复制构造函数(即* this)创建名为oldState的新对象。该对象由函数返回。
答案 1 :(得分:1)
return *oldState;
似乎是一个错误,应该是return oldState;
return oldState;
没关系,因为它在堆栈上返回一个副本
Clock oldState= *this;
indead制作副本并将其存储在oldState
答案 2 :(得分:0)
*this
是Clock
的当前实例。正如您所说,这会调用复制构造函数,但此方法应为oldState
。
答案 3 :(得分:0)
将当前状态复制到堆栈上分配的新对象Clock
,然后真正执行增量,然后返回先前保存的对象(除了我确实认为存在拼写错误在*
之前应该不是oldState
,否则它将无法编译。
这是预期的行为,因为后缀增量应该在增量之前返回对象的状态。在int上,它不会震惊你吗?
unsigned int i = 2;
std::cout << i++ << std::endl;
输出为2
,而对于:
unsigned int i = 2;
std::cout << ++i << std::endl;
输出为3
。
对于支持postfix增量的所有对象,应该会发生同样的事情。