对“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
是否会创建临时对象并将值分配给原始对象?
答案 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;
}
注意它是如何通过调用复制构造函数(而不是覆盖)返回类增值之前的类值,以及它如何逐个增加类的成员。