Бьерн Страуструп.
Язык программирования С++
128
date now;
//
инициализация стандартным значением
Размножение конструкторов в примере c date типично. При разработке класса всегда есть соблазн
добавить еще одну возможность, - а вдруг она кому-нибудь пригодится. Чтобы определить
действительно нужные возможности, надо поразмышлять, но зато в результате, как правило,
получается более компактная и понятная программа. Сократить число сходных функций можно с
помощью стандартного значения параметра. В примере с date для каждого параметра можно задать
стандартное значение, что означает: "взять значение из текущей даты".
class date {
int month, day, year;
public:
//
...
date(int d =0, int m =0, y=0);
//
...
};
date::date(int d, int m, int y)
{
day = d ? d : today.day;
month = m ? m : today.month;
year = y ? y : today.year;
// проверка правильности даты
//
...
}
Когда используется стандартное значение параметра, оно должно отличаться от всех допустимых
значений параметра. В случае месяца и дня очевидно, что при значении нуль - это так, но неочевидно,
что нуль подходит для значения года. К счастью, в европейском календаре нет нулевого года, т.к. сразу
после 1 г. до р.х. (year==-1) идет 1 г. р.х. (year==1). Однако для обычной программы это, возможно,
слишком тонкий момент.
Объект класса без конструктора может инициализироваться присваиванием ему другого объекта этого
же класса. Это незапрещено и в том случае, когда конструкторы описаны:
date d = today; // инициализация присваиванием
На самом деле, имеется стандартный конструктор копирования, определенный как поэлементное
копирование объектов одного класса. Если такой конструктор для класса X не нужен, можно
переопределить его как конструктор копирования X::X(const X&). Подробнее поговорим об этом в $$7.6.
Достарыңызбен бөлісу: