Нужно ли инициализировать член класса частного списка в конструкторе?

У меня есть заголовочный файл:

class day
{
public:
day(int id);
~day();

private:
int id;
std::list<meeting*> meetings;


};

и в моем файле .cpp:

#include "day.h"
#include "meeting.h"

day::day(int id) : id(id) {  }

Нужно ли добавлять meetings() в список инициализации конструктора?

day::day(int id) : id(id), meetings() {  }

Я не уверен в правилах инициализации объектов конструкторами. Все ли частные объекты-члены инициализируются, даже если они не инициализированы явно в конструкторе? Кроме того, мне нужно создать деструктор для списка, чтобы удалить объекты в списке?

Спасибо.


person Michael    schedule 15.05.2012    source источник


Ответы (4)


Нет, типы, имеющие конструкторы по умолчанию, по умолчанию инициализируются значением.

Если вы опустите id из списка инициализации, он не будет инициализирован, потому что это int. Однако участник std::list будет.

Это не имеет ничего общего с public/private.

Кроме того, мне нужно создать деструктор для списка, чтобы удалить объекты в списке?

Только если day является владельцем этих объектов. Если они созданы вне класса и просто вставлены в член класса, вполне вероятно, что вызывающий контекст должен обрабатывать уничтожение.

person Luchian Grigore    schedule 15.05.2012
comment
Я думаю, что у java int есть собственный конструктор ... но у int of c ++ нет, потому что это примитивный тип ... верно? - person solti; 23.05.2016

Нет, list по умолчанию будет пустым. Вопрос о том, нужно ли вам удалять объекты в list в деструкторе, зависит от того, как вы заполняете список. Если вы вставляете что-то вроде meetings.insert(new meeting()), то да, вам нужно удалить объекты в деструкторе.

person Naveen    schedule 15.05.2012

Вам не нужно инициализировать std::list, так как будет вызван его конструктор по умолчанию.

Обычно мы должны инициализировать следующее:

  1. Встроенные типы, такие как int, float и т. д., иначе они будут инициализированы мусорными значениями.
  2. Все другие определяемые пользователем типы, у которых нет конструктора по умолчанию.
person saurabh jindal    schedule 15.05.2012

Нет, в этом нет необходимости, поскольку вам достаточно конструкции по умолчанию.

Точно так же, когда ваш объект будет уничтожен, он уничтожит список. Однако я не думаю, что список автоматически уничтожит все свое содержимое, поэтому вам все равно нужно сделать это в своем деструкторе.

person unwind    schedule 15.05.2012
comment
так что в основном конструктор day вызывает конструктор по умолчанию каждого из частных членов? - person Michael; 15.05.2012
comment
Верно. Он вызывает конструкторы по умолчанию для всех членов, если вы явно не укажете ему использовать конструктор не по умолчанию для данного члена. - person Steed; 15.05.2012
comment
Но учтите, что обычные типы данных (int, double и т. д.) не имеют конструктора, поэтому их память остается неинициализированной. - person Steed; 15.05.2012