Инструменты пользователя

Инструменты сайта


examination:oop:question31

31. Параметры конструктора и возможности их использования. Программирование алгоритма конструктора

Параметры конструкторов подчиняются тем же правилам о типах параметров, что и все остальные функции. Пока конструкторы достаточно различаются по типам своих параметров, транслятор способен правильно выбрать конструктор:

      date today(4); 
      date july4("July 4, 1983"); 
      date guy("5 Nov"); 
      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; // инициализация присваиванием 
examination/oop/question31.txt · Последние изменения: 2014/01/15 12:22 (внешнее изменение)