Date temp = *this;
Date temp(*this);
Конструктор копирования обоих вызовов,
Первый называется Инициализация копирования , а второй - Прямая инициализация .
Простое правило для запоминанияэто:
Если объект создается и инициализируется в том же операторе, он вызывает конструктор копирования.
Если объект только что назначен и не создается в том же операторе, то он вызывает оператор Assignment (Copy Assignment).
Компилятор жалуется, потому что:
Обычный строковый литерал имеет тип «массив из n константных символов».И неявное преобразование из const в неконстантную квалификацию для строковых литералов (4.2) не рекомендуется.
Ссылки:
Стандартный раздел C ++ [2.13.4 / 2]:
Обычный строковый литерал имеет тип array of n const char
, где n - размер строки, как определено ниже;он имеет статическую продолжительность хранения (3.7) и инициализируется заданными символами.
раздел Приложения D [D.4 / 1]
неявное преобразованиес const
до non-const
квалификация для string literals
(4.2) устарела.
Поэтому, чтобы избежать предупреждения, вы должны использовать:
static const char *monthName[13]
^^^^^^^