|
Программирование >> Дополнительные возможности наследования
Конструкторы, как и все другие функции, можно перегружать. Перегрузка конструкторов - мощное средство повышения эффективности и гибкости программы. Например, рассматриваемый нами объект Rectangle может иметь два конструктора. В первом задается ширина и длина прямоугольника, а второй не имеет параметров и для установки размеров использует значения по умолчанию. Эта идея реализована в листинге 10.3. Дцстцнг to.3. Нерегрузка инструктора 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 Листинг 10,3. Перегрузка конструктора ffinclude <iostream.h> class Rectangle { public: RectangleO; Rectangle(int width, int length); RectangleO { } int GetWidthO const { return itsWidth; } int GetLengthO const { return itsLength; } private: int itsWidth; int itsLength; Rectangle: :RectangleO { itsWidth = 5; itsLength = 10; Rectangle::Rectangle (int width, int length) { itsWidth = width; itsLength = length; int mainO { Rectangle Recti; cout Recti width: Recti, GetWidthO endl; cout Recti length: Recti.GetLengthO endl; int aWidth, aLength; cout Enter a width; ; cin aWidth; cout \ nEnter a length: ; cin aLength; 43 44 45 46 47 Rectangle Rect2(aWidth, aLength); cout \ nRect2 width: Rect2.GetWidth() endl; cout Rect2 length: Rect2.GetLengthO endl; return 0; fit7*-:-f Recti width; 5 Enter a width: 20 Enter a length: 50 Rect2 width: 20 Rect2 length: 50 lt* ; Класс Rectangle обьявляется в строках с 6 по 17. В классе представлены два кон- m<:;4i<\ структора; один использует значения по умолчанию (строка 9), а второй при- нимает значения двух целочисленных параметров (строка 10). В строке 33 прямоугольный объект создается с использованием первого конструктора. Значения размеров прямоугольника, принятые по умолчанию, вьтодятся на экран в строках 34 и 35. Строки программы с 37 по 41 выводят на экран предложения пользователю ввести собственные значения ширины и длины прямоугольника. В строке 43 вызывается второй конструктор, использующий два параметра с только что установленными значениями. И наконец, значения размеров прямоугольника, установленные пользователем, вьтодятся на экран в строках 44 и 45. Как и при использовании других перегруженных функций, компилятор выбирает нужное объявление конструктора, основываясь на числе и типе параметров. Инициализация пОъектпв До сих пор переменные-члены объектов задавались прямо в теле конструктора. Выполнение конструктора происходит в два этапа: инициализация и выполнение тела конструктора. Большинство переменных может быть задано на любом из этих этапов: как во время инициализации, так и во время выполнения конструктора. Но логически правильнее, а зачастую и эффективнее, инициализировать переменные-члены во время инициализации конструктора. В следующем примере показана инициализация переменных-членов: САТ(): имя конструктора и список параметров itsAge(5), инициализация списка itsWeigth(8) {} тело конструктора После скобки закрытия списка параметров конструктора ставится двоеточие. Затем перечисляются имена переменных-членов. Пара круглых скобок со значением за именем переменной используется для инициализации этой переменной. Если инициализируется сразу несколько переменных, то они должны быть отделены запятыми. В листинге 10.4 показана инициализация переменных конструкторов, взятых из листинга 10.3. В данном примере инициализация переменных используется вместо присвоения им значений в теле конструктора. Аистонг 10.4. Фрагмент программного коде с нинциализацнеО веременных-членов Rectangle::Rectangle(): itsWidth(5), itsLength(IO) < } Rectangle::Rectangle (int width, int length): itsWidth(width), itsLength(length) 10: { 11: } Отсутствует. Некоторые переменные можно только инициализировать и нельзя присваивать им значения: например, в случае использования ссылок и констант. Безусловно, переменной-члену можно присвоить значение прямо в теле конструктора, но для упрощения профаммы лучще по возможности устанавливать значения переменных-членов на этапе инициализации конструктора. Конструктор-копировщик Помимо конструктора и десфуктора, компилятор по умолчанию предоставляет также консфуктор-копировщик, который вызывается всякий раз, когда нужно создать копию объекта. Когда объект передается как значение либо в функцию, либо из функции в виде возврата, всегда создается его временная копия. Если в профамме обрабатывается объект, созданный пользователем, то для выполнения этих операций вызывается консфуктор-копировщик класса, как было показано на предьщущем занятии в листинге 9.6. Все копировщики принимают только один параметр - ссылку на объект в том же классе. Разумно будет сделать эту ссылку константной, так как конструктор не должен изменять передаваемый в него объект. Например: CAKconst CAT & theCat); В данном случае консфуктор CAT принимает константную ссылку на объект класса CAT. Цель использования консфукгора-копировщика состоит в создании копии объекта theCat. Копировщик, заданный компилятором по умолчанию, просто копирует все переменные-члены из указанного в параметре объекта в переменные-члены нового объекта. Такое копирование называется поверхностным; и, хотя оно подходит для боль-щинства случаев, могут возникнуть серьезные проблемы, если переменные-члены окажутся указателями на ячейки динамической памяти. Поверхностное копирование создает несколько переменных-членов в разных объектах, которые ссылаются на одни и те же ячейки памяти. Глубинное копирование переписывает значения переменных по новым адресам.
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |