ещё пара советов по оптимизации: исхожу из предположений
1) последовательность уточнения даты: год, месяц, день, час, минута, секунда, либо в обратном порядке. Т.е. нет смысла задавать дату днём и годом (без указания месяца).
2) обратный порядок нужен только для того, чтобы сокращённо задавать промежуток времени (например интервал 1 день 5 секунд). А его лучше задавать количеством секунд, а не датой. Поэтому обратный порядок тоже не нужен.
Код:

// Таким образом нужен один конструктор:
class Date {
public:
Date(int year=0, int month=1, int day = 1, int hour=0, int min=0, int sec=0);
...
private:
_hidden_init(); // не раскрывается inline
};
// т..к. по сути мы даём возможность заполнить структуру, то лучше вынести inline
// так мы разделим присвоение параметров (как бы inline) и дальнейшую обработку _hidden_init()
inline Date::Date(...)
{
...
_hidden_init();
}
Если нужно иногда использовать время отдельно от даты, то можно сделать так:
Код:

// Таким образом нужен один конструктор:
class Time {
public: Time(int h, int m, int s);
};
class Date {
public: Date(int y, int m, int d);
};
class DateTime
{
public:
DateTime(const Date&, const Time&);
DateTime(const Date&);
DateTime(const Time&);
};
// тогда путаницы не возникнет