В книге Бьярна Страуструпа «Язык программирования C ++ (4-е издание)» в разделе 17.6 («Генерация операций по умолчанию») упоминается следующее:
Если программист объявляет операцию копирования, операцию перемещения или
деструктор для класса, без операции копирования, перемещения или
деструктор генерируется для этого класса.
Таким образом, я запутался, почему в этой программе вызывается деструктор SubObj
:
#include <iostream>
using namespace std;
class SubObj {
public:
~SubObj() {
cout << "SubObj Destructor called" << endl;
}
};
class Obj {
private:
SubObj so;
public:
Obj() {};
Obj(const Obj& o) {};
};
int main() {
Obj();
cout << "Program end" << endl;
}
При компиляции с g ++ я получаю следующий вывод:
$ ./a.out
SubObj Destructor called
Program end
Исходя из моего понимания, я ожидал, что деструктор по умолчанию для Obj
не будет сгенерирован автоматически, потому что я определил операцию копирования для Obj
. И поэтому я ожидал, что SubObj
член Obj
не будет уничтожен, потому что для Obj
.
не существует деструктора.
Итак, мне интересно: члены объекта автоматически уничтожаются даже без деструктора? Или деструктор как-то генерируется автоматически для этого примера?
Изменить:
Далее в книге (17.6.3.4), ссылаясь на пример, Бьярне упоминает:
Мы определили назначение копирования, поэтому мы также должны определить деструктор.
Этот деструктор может быть =default
, потому что все, что ему нужно сделать, это
убедитесь, что член pos
удален, что
все равно было сделано, если назначение копии не было определено.
Судя по полученным ответам, кажется, что Бьярне, возможно, только что ошибся в этом.