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

时间:2013-12-08 20:39:59

标签: c++ pointers operator-overloading

Clock Clock::operator++(int x)
{
    Clock oldState= *this;
    tick();

    return *oldState;
}

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

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

4 个答案:

答案 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)

*thisClock的当前实例。正如您所说,这会调用复制构造函数,但此方法应为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增量的所有对象,应该会发生同样的事情。