Программирование >>  Дополнительные возможности наследования 

1 ... 81 82 83 [ 84 ] 85 86 87 ... 265


Конструкторы, как и все другие функции, можно перегружать. Перегрузка конструкторов - мощное средство повышения эффективности и гибкости программы.

Например, рассматриваемый нами объект 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.

Копировщик, заданный компилятором по умолчанию, просто копирует все переменные-члены из указанного в параметре объекта в переменные-члены нового объекта. Такое копирование называется поверхностным; и, хотя оно подходит для боль-щинства случаев, могут возникнуть серьезные проблемы, если переменные-члены окажутся указателями на ячейки динамической памяти.

Поверхностное копирование создает несколько переменных-членов в разных объектах, которые ссылаются на одни и те же ячейки памяти. Глубинное копирование переписывает значения переменных по новым адресам.



1 ... 81 82 83 [ 84 ] 85 86 87 ... 265

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика