8

对“this”指针的操作是否调用构造函数?

我有一个定义如下的构造函数

    Cents(int cents)
    {
            cout<<"in cents constructor\n";
            m_cents = cents;
    }

    friend Cents operator + (const Cents &c1, const Cents &c2)
    {           
            return Cents(c1.m_cents + c2.m_cents);
    }

    Cents operator ++ (int)
    {
            cout<<"In c++ function\n";
            Cents c(m_cents);
            *this = *this + 1 ;
            return c;
    }

在主要功能中,我有……

    Cents c;
    cout<<"Before post incrementing\n";
    c++; //This part is calling the constructor thrice 

现在如果我正在做一些操作,比如*this = *this + 1. 它调用这个构造函数两次。

这里到底发生了什么。是否*this创建一个临时对象并将值分配给原始对象?

4

2 回答 2

11

不,取消引用指针不会创建任何新对象

然而,如果你operator+只为你的类的实例定义,将会有一个从构造的新实例 1,因为构造函数Cents(int cents)没有被标记为显式。

于 2012-04-22T10:39:48.453 回答
3

您在这里进行了大量的建设!

Cents c;

这一行调用Cents::Cents(),它是由编译器合成的,可能不会做你想做的事。

然后你打电话:

Cents Cents::operator++(int)

它返回一个对象并显式调用Cents::Cents(int).

然后你做你好奇的任务,这会第二次调用Cents::Cents(int)第二个参数。

当你打电话时,Cents operator+(const Cents&, const Cents&)你明确地构造一个新的Cents::Cents(int)并返回它的副本......

然后你调用了 synthesised Cents& Cents::operator=(const Cents&),它可能又不能做你想做的事。

典型的后增量运算符如下所示:

Cents& operator++(int)
{
    Cents rv = *this;

    ++m_cents;

    return rv;
}

请注意它如何通过调用复制构造函数(而不是覆盖)返回类的值,就像它在递增之前一样,以及它如何单独递增类的成员。

于 2012-04-22T11:17:01.430 回答