|
Программирование >> Дополнительные возможности наследования
образом в строке 102 объявляется функция AnimalFillFunctionO, которая принимает массив объектов типа Animal. Эти функции выполняются по-разному, поскольку заполнение массива целых чисел отличается от заполнения массива объектов Animal. Если разблокировать выражения вывода на экран в конструкторах и деструкторе класса Animal (см. листинг 19.5), то обнаружится, что конструктор и деструктор объектов Animal вызываются значительно чаще, чем ожидалось. При добавлении объекта в массив вызывается стандартный конструктор объекта. Однако конструктор класса Array также используется для присвоения нулевых значений каждому члену массива, как показано в строках 59 и 60 листинга 19.2. В выражении someAnimal = (Animal) 0; вызывается стандартный оператор operator= для класса Animal. Это приводит к созданию временного объекта Animal с помощью конструктора, который принимает целое число (нуль). Этот временный объект выступает правым операндом в операции присваивания, после чего удаляется деструктором. Такой подход крайне неэффективен, поскольку объект Animal уже инициализирован должным образом. Однако эту строку нельзя удалить, потому что при создании массива целочисленные значения не будут автоматически инициализироваться нулевыми значениями. Выход состоит в том, чтобы объявить в шаблоне дополнительный специализированный конструктор для создания массива объектов Animal. Эта идея реализована в листинге 19.6 путем явного выполнения класса Animal. Аисшинг 19.В. Специальные реахозацоо шаблона 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 ftinclude <iostream.h> const int DefaultSize = 3; Обычный класс, из объектов которого создается массив class Animal { public; конструкторы Animal(int); Animal(); AnimalO; методы доступа int GetWeightO const { return itsWeight; } void SetWeight(int theWeight) { itsWeight = theWeight; } дружественные операторы friend ostream& operator (ostream&, const Animal&); private; int itsWeight; 25; оператор вывода обьектов типа Animal 26: ostream& operator 27: (ostreami theStream, const Animali theAnimal) 28: { 29: theStream theAnimal,GetWeightO; 30; return theStream; 31: } 32: 33; Animal:;Animal(int weight); 34: itsWeight(weight) 35: { 36; cout animal(int) ; 37; } 39: Animal:;Animal(); 40; itsWeight(O) 41: { 42: cout animalO ; 43: } 45; Animal;;AnimalO 46: { 47; cout Destroyed an animal , ; 48; ) 50; template <class T> объявляем шаблон и параметр 51: class Array параметризованный класс 52; { 53: public; 54: Array(int itsSize = DefaultSize); 55; Array(const Array &rhs); 56; ArrayO { delete [] pType; } 58; операторы 59; Arrayi operator=(const Arrayi); 60; T& operator[](int offSet) { return pType[offSet]; } 61; const T& operator[](int offSet) const 62: { return pType[offSet]; ) 63; методы доступа 64; int GetSizeO const { return itsSize; } 66; функция-друг 67: friend ostreami operator (ostreami, const Array<T>&); 68: 69; private: 70: T рТуре; 71; int itsSize; 72: ) ; 73; template <class T> Array<T>::Array(int size = DefaultSize): itsSize(size) pType = new T[size]: for (int 1 = 0; Ksize; i++) pType[i] = (T)0; template <class T> Array<T>& Array<T>;;operator=(const Array &rhs) { if (this == &rhs) return this; delete [] pType; itsSize = rhs.GetSizeO; pType = new T[itsSize]; for (int 1 = 0; KitsSize; i++) pType[i] = rhs[i]; return this; template <class T> Array<T>:;Array(const Array &rhs) itsSize = rhs.GetSizeO; pType = new T[ItsSize]; for (Int 1 = 0; KitsSize; i++) pType[i] = rhs[l]; template <class T> ostreami operator (ostream& output, const Array<T>4 theArray) { for (int 1 = 0; KtheArray,GetSizeO; i++) output [ 1 ] theArrayii] endl; return output; Array<Anlmal>::Array(lnt AnlmalArraySize): itsSize(AnimalArraySi2e) pType = new Anlmal[AnimalArraySize]; void IntFillFunotion(Array<int>& theArray); void AnimalFillFunction(Array<Animal>4 theArray);
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |