|
Программирование >> Расширенная версия языка c++
7. На основе следующего прототипа создайте функции mg(), повышающую порядок значения переменной num до того уровня, который задан переменной order: . : w voi g Snum, long order}? Например, если переменная шт равна 4, а переменная order равна 2, то после выполнения функции mag() переменная должна стать равной 400. Напишите демонстрационную программу, показывающую, что функция работает. 5.1. Перегрузка конструкторов В программах на C++ перегрузка конструктора класса вполне обычна. (Деструктор, однако, перегружать нельзя.) Имеется три основнхх причины перегрузки конструктора, которая, как правило, выполняется либо для обеспечения гибкости, либо для поддержки массивов, либо для создания конструкторов копий. В этом разделе рассказывается об обеспечении гибкости и поддержке массивов, а о конструкторах копий - в следующем. Перед изучением примеров необходимо запомнить одну вещь: каждому способу объявления объекта класса должна соответствовать своя версия конструктора класса. Если эта задача не решена, то при компиляции программы обнаружится ошибка. Именно поэтому перегрузка конструктора столь обычна для программ C++. Вероятно, наиболее частое использование перегрузки конструктора - это обеспечение возможности выбора способа инициализации объекта. Например, в следующей программе объекту ol дается начальное значение, а объекту о2 - нет. Если вы удалите конструктор с пустым списком аргументов, программа не будет компилироваться, поскольку у неинициализируемого объекта типа samp не будет конструктора. И наоборот, если вы удалите конструктор с параметром, программа не будет компилироваться, поскольку не будет конструктора у инициализируемого объекта типа samp. Для правильной компиляции программы необходимы оба конструктора. tinclude <iostream> о using namespace std; - f class myclass { public: перегрузка конструктора двумя способами myclas;:. { x -= 0; J нет инициализации myclass (int n) { x n; } инициализация int getx О { return x; } int main () { myclass 10) ; объявление с начальным значением myclass o2; объявление без начального значения cout о1: ol.getxO \п; . cout << о2; o2.getx() \п; return 0; 2. Другой традиционный довод в пользу перегрузки конструктора состоит в том, что такая перегрузка позволяет сосуществовать в программе как отдельным объектам, так и массивам объектов. Как вы, наверное, знаете по своему опыту программирования, вполне обычно инициализировать отдельную переменную, тогда как инициализация массива встречается достаточно редко. (Гораздо чаще элементам массива присваиваются их значения в зависимости от информации, получаемой уже при выполнении программы.) Таким образом, для сосуществования в программе неинициализированных массивов объектов наряду с инициализированными объектами вы должны использовать конструктор, который поддерживает инициализацию, и конструктор, который ее не поддерживает. Например, для класса myclass из примера 1 оба этих объявления правильны: myclass ob(lO); myclass ob[5] ; Обеспечив наличие обои укторов (с параметрами и без параметров), вы в своей программе получаете возможность создавать объекты, которые при необходимости можно либо инициализировать, либо нет. Естественно, что после определения конструктора с параметрами и конструктора без параметров, их можно использовать для создания инициализированных или неинициализированных массивов. Например, в следующей программе объявляются два массива типа myclass; при этом один из них инициализируется, а другой нет: #include <iostream> , using namespace std; - ; class myclass { int x; public: перегрузка конструктора двумя способами myclass!) { x = 0; } нет инициализации return 0; В этом примере все элементы массива ol конструктор устанавливает в нуль. Элементы массива о2 инициализируются так, как показано в программе. 3. Другой довод в пользу перегрузки конструкторов состоит в том, что такая перегрузка позволяет программисту выбрать наиболее подходящий метод инициализации объекта. Чтобы понять, как это делается, рассмотрим следующий пример, в котором создается класс для хранения календарной даты. Конструктор dateO перегружается двумя способами. В первом случае данные задаются в виде строки символов, в другом - в виде трех целых. #include <iostream> #include <cstdio> заголовок для функции sscanfO using namespace std; class date { int day, month, year; >:, - public: .. date (char date (in-., int d, int y) { , < day = d; month = m; year = void { cou< mont W day / ; - . myclass(in) { x = n; } инициализация ±;it.jeLX() { return x; } - int main () myclass ol[10]; объявление массива без инициализации объявление с инициализацией myclass o2tl0] = {1,2,3,4,5,6,7,8,9,10); int i; for(1=0; i<10; i++) ( cou [ i ] : ol [i] . getx ( ) ; coiit Vn ; cout i cout \n ;
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |