В методе operator ++ вы создаете временный объект A, который затем уничтожается, когда вы возвращаете его из функции. Должна быть и другая копия строительства и уничтожения, но RVO elides этот.
Когда вы добавляете журнал в конструктор, вы также увидите, что происходит дальше. Я также позволил себе изменить printf на cout, для более стильного стиля C++ ish.
#include <iostream>
class A {
public:
int value;
A(int value) {
std::cout << "creating " << value << std::endl;
this->value = value;
}
~A() {
std::cout << "destroying " << value << std::endl;
}
A operator ++() { return A(value + 1); }
};
int main() {
A a(1);
std::cout << "before increment: " << a.value << std::endl;
a = ++a;
std::cout << "after increment: " << a.value << std::endl;
return 0;
}
выход:
creating 1
before increment: 1
creating 2
destroying 2
after increment: 2
destroying 2
Вы можете также прочитать о канонических реализациях операторов перегрузки:
http://en.cppreference.com/w/cpp/language/operators
оператор ++ перегрузка должна выглядеть следующим образом:
struct X
{
X& operator++() // prefix version
{
// actual increment takes place here
return *this;
}
X operator++(int) // postfix version
{
X tmp(*this); // copy
operator++(); // pre-increment
return tmp; // return old value
}
};
Вы имеете в виду первое или второе разрушение? –
Ваш 'operator ++()' должен возвращать ссылку (самому себе) после приращения самого себя, а не создавать новую временную 'A'. Как написано, этот код будет путать ад с пользователей класса. –