В моем стремлении изучить С++ я наткнулся на статью Написание конструкторов копий и операторов присваивания, в которой предлагается механизм, позволяющий избежать дублирования кода между конструкторами копирования и операторами присваивания.
Чтобы суммировать/дублировать содержание этой ссылки, предлагаемый механизм:
struct UtilityClass
{
...
UtilityClass(UtilityClass const &rhs)
: data_(new int(*rhs_.data_))
{
// nothing left to do here
}
UtilityClass &operator=(UtilityClass const &rhs)
{
//
// Leaves all the work to the copy constructor.
//
if(this != &rhs)
{
// deconstruct myself
this->UtilityClass::~UtilityClass();
// reconstruct myself by copying from the right hand side.
new(this) UtilityClass(rhs);
}
return *this;
}
...
};
Это похоже на хороший способ избежать дублирования кода, обеспечивая при этом "программную целостность", но при этом нужно учитывать риск потери усилий, а затем - выделение вложенной памяти, которая вместо этого может быть повторно использована (как указывает ее автор).
Но я не знаком с синтаксисом, лежащим в его основе:
this->UtilityClass::~UtilityClass()
Я предполагаю, что это способ вызвать деструктор объекта (уничтожить содержимое структуры объекта), сохраняя при этом структуру. Для новичков С++ синтаксис выглядит как странная смесь метода объекта и метода класса.
Может ли кто-нибудь объяснить этот синтаксис мне или указать на ресурс, который объясняет это?
Как этот вызов отличается от следующего?
this->~UtilityClass()
Это законный звонок? Это дополнительно разрушает структуру объекта (свободна от кучи, выталкивает стек)?