后增量 ++ 运算符重载中的指针

pointer in post increment ++ operator overloading

本文关键字:指针 重载 运算符      更新时间:2023-10-16
Clock Clock::operator++(int x)
{
    Clock oldState= *this;
    tick();
    return *oldState;
}

运算符重载函数创建一个指向 *this 的对象 oldState。那是什么意思?它是否将本地对象的地址分配给 oldState?或者它是否使用 = 运算符重载(调用复制构造函数(。它有什么作用?

并返回 *oldState,它不会超出范围,因为您没有在堆上声明它吗?

首先是这段代码

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 的新对象。并且此对象由函数返回。

return *oldState;似乎是一个错误,应该return oldState;

return oldState;没关系,因为它在堆栈上返回一个副本

Clock oldState= *this; indead 制作副本并将其存储在 oldState 中

*thisClock的当前实例。正如您正确所说,这调用了复制构造函数,但此方法应该oldState

它是将当前状态复制到堆栈上分配的新对象Clock,然后真正执行增量,然后返回以前保存的对象(除了我确实认为有一个错别字,在oldState之前不应该有*,否则它将无法编译(。

这是预期的行为,因为后缀增量应该在增量之前返回对象的状态。在 int 上,它不会让你感到震惊吗?

unsigned int i = 2;
std::cout << i++ << std::endl;

输出将2,而对于:

unsigned int i = 2;
std::cout << ++i << std::endl;

输出将3

对于所有支持后缀增量的对象,都应该发生同样的事情。