*这会调用构造函数?

时间:2012-04-22 10:34:27

标签: c++

对“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是否会创建临时对象并将值分配给原始对象?

2 个答案:

答案 0 :(得分:11)

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

Hovever,如果您operator+仅为您的课程实例定义,则会有一个新实例由 1构建,因为构造函数Cents(int cents)未标记为明确。

答案 1 :(得分:3)

你们在这里发生了很多争议!

Cents c;

此行调用Cents::Cents(),它由编译器合成,可能无法按照您的意愿执行。

然后你打电话:

Cents Cents::operator++(int)

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

然后你做了好奇的任务,第二次调用Cents::Cents(int)进行第二次调用。

当您致电Cents operator+(const Cents&, const Cents&)时,您明确构建了一个新Cents::Cents(int)并返回了它的副本......

然后你调用合成的Cents& Cents::operator=(const Cents&),这可能不会做你想要的。

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

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

    ++m_cents;

    return rv;
}

注意它是如何通过调用复制构造函数(而不是覆盖)返回类增值之前的类值,以及它如何逐个增加类的成员。