Главная » Просмотр файлов » С.Б. Липпман, Ж. Лажойе - Язык программирования С++ Вводный курс

С.Б. Липпман, Ж. Лажойе - Язык программирования С++ Вводный курс (1114944), страница 12

Файл №1114944 С.Б. Липпман, Ж. Лажойе - Язык программирования С++ Вводный курс (С.Б. Липпман, Ж. Лажойе - Язык программирования С++ Вводный курс) 12 страницаС.Б. Липпман, Ж. Лажойе - Язык программирования С++ Вводный курс (1114944) страница 122019-05-08СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 12)

Затем начинает работать конструктор производного класса, гдемы должны проинициализировать только те члены, которые являются специфичными дляподкласса, то есть отсутствуют в базовом классе.Однако заметим, что в нашем производном классе IntArrayRC нет новых членов,представляющих данные. Значит ли это, что нам не нужно реализовывать конструкторыдля него? Ведь вся работа по инициализации членов данных уже проделанаконструкторами базового класса.На самом деле конструкторы, как и деструкторы или операторы присваивания, ненаследуются – это правило языка С++. Кроме того, конструктор производного классаобеспечивает механизм передачи параметров конструктору базового класса.

Рассмотримint ia[] = {0,1,1,2,3,5,8,13};пример. Пусть мы хотим создать объект класса IntArrayRC следующим образом:IntArrayRC iarc(ia,8);51С++ для начинающихНам нужно передать параметры ia и 8 конструктору базового класса IntArray. Дляэтого служит специальная синтаксическая конструкция.

Вот как выглядят реализацииinline IntArrayRC::IntArrayRC( int sz ): IntArray( sz ) {}inline IntArrayRC::IntArrayRC( const int *iar, int sz )двух конструкторов IntArrayRC:: IntArray( iar, sz ) {}(Мы будем подробно говорить о конструкторах в главах 14 и 17. Там же мы покажем,почему не нужно реализовывать конструктор копирования для IntArrayRC.)Часть определения, следующая за двоеточием, называется списком инициализации членов.Именно здесь, указав конструктор базового класса, мы можем передать ему параметры.Тела обоих конструкторов пусты, поскольку их работа состоит исключительно в передачепараметров конструктору базового класса.

Нам не нужно реализовывать деструктор дляIntArrayRC, так как ему просто нечего делать. Точно так же, как при создании объектапроизводного типа вызывается сначала конструктор базового типа, а затем производного,при уничтожении автоматически вызываются деструкторы – естественно, в обратномпорядке: сначала деструктор производного, затем базового. Таким образом, деструкторбазового класса будет вызван для объекта типа IntArrayRC, хотя тот и не имеетсобственной аналогичной функции.Мы поместим все встроенные функции класса IntArrayRC в тот же заголовочный файлIntArrayRC.h.

Поскольку у нас нет невстроенных функций, то создавать файлIntArrayRC.C не нужно.Вот пример простой программы, использующей классы IntArray и IntArrayRC:52С++ для начинающих#include <iostream>#include "IntArray.h"#include "IntArrayRC.h"void swap({int tmpia[ ix ]ia[ jx ]}IntArray &ia, int ix, int jx )= ia[ ix ];= ia[ jx ];= tmp;int main(){int array[ 4 ] = { 0, 1, 2, 3 };IntArray ia1( array, 4 );IntArrayRC ia2( array, 4 );// ошибка: должно быть size-1// не может быть выявлена объектом IntArraycout << "swap() with IntArray ia1" << endl;swap( ia1, 1, ia1.size() );// правильно: объект IntArrayRC "поймает" ошибкуcout << "swap() with IntArrayRC ia2" << endl;swap( ia2, 1, ia2.size() );return 0;}При выполнении программа выдаст следующий результат:swap() with IntArray ia1swap() with IntArrayRC ia2Assertion failed: ix >= 0 && ix < _size,file IntArrayRC.h, line 19Упражнение 2.8Отношение наследования между типом и подтипом служит примером отношенияявляется.

Так, массив IntArrayRC является подвидом массива IntArray, книга являетсяподвидом выдаваемых библиотекой предметов, аудиокнига является подвидом книги и(a) функция-член является подвидом функции(b) функция-член является подвидом класса(c) конструктор является подвидом функции-члена(d) самолет является подвидом транспортного средства(e) машина является подвидом грузовика(f) круг является подвидом геометрической фигуры(g) квадрат является подвидом треугольника(h) автомобиль является подвидом самолетат.д. Какие из следующих утверждений верны?(i) читатель является подвидом библиотеки53С++ для начинающихУпражнение 2.9Определите, какие из следующих функций могут различаться в реализации для(a) rotate();(b) print();(c) size();(d) DateBorrowed(); // дата выдачи книги(e) rewind();(f) borrower(); // читатель(g) is_late(); // книга просроченапроизводных классов и, таким образом, выступают кандидатами в виртуальные функции:(h) is_on_loan(); // книга выданаУпражнение 2.10Ходят споры о том, не нарушает ли принципа инкапсуляции введение защищенногоуровня доступа.

Есть мнение, что для соблюдения этого принципа следует отказаться отиспользования такого уровня и работать только с закрытыми членами. Противоположнаяточка зрения гласит, что без защищенных членов производные классы невозможнореализовывать достаточно эффективно и в конце концов пришлось бы вездезадействовать открытый уровень доступа. А каково ваше мнение по этому поводу?Упражнение 2.11Еще одним спорным аспектом является необходимость явно указывать виртуальностьфункций в базовом классе.

Есть мнение, что все функции должны быть виртуальными поумолчанию, тогда ошибка в разработке базового класса не повлечет таких серьезныхпоследствий в разработке производного, когда из-за невозможности изменитьреализацию функции, ошибочно не определенной в базовом классе как виртуальная,приходится сильно усложнять реализацию. С другой стороны, виртуальные функцииневозможно объявить как встроенные, и использование только таких функций сильноснизит эффективность.

Каково ваше мнение?Упражнение 2.12Каждая из приведенных ниже абстракций определяет целое семейство подвидов, как,например, абстракция “транспортное средство” может определять “самолет”,“автомобиль”, “велосипед”. Выберите одно из семейств и составьте для него иерархиюподвидов. Приведите пример открытого интерфейса для этой иерархии, включаяконструкторы. Определите виртуальные функции.

Напишите псевдокод маленькой(a) Точка(b) Служащий(c) Фигура(d) Телефонный_номер(e) Счет_в_банкепрограммы, использующей данный интерфейс.54С++ для начинающих(f) Курс_продажи2.5. Использование шаблоновНаш класс IntArray служит хорошей альтернативой встроенному массиву целых чисел.Но в жизни могут потребоваться массивы для самых разных типов данных. Можнопредположить, что единственным отличием массива элементов типа double от нашегоявляется тип данных в объявлениях, весь остальной код совпадает буквально.Для решения данной проблемы в С++ введен механизм шаблонов.

В объявлениях классови функций допускается использование параметризованных типов. Типы-параметрызаменяются в процессе компиляции настоящими типами, встроенными илиопределенными пользователем. Мы можем создать шаблон класса Array, заменив вклассе IntArray тип элементов int на обобщенный тип-параметр.

Позже мыконкретизируем типы-параметры, подставляя вместо них реальные типы int, double иstring. В результате появится способ использовать эти конкретизации так, как будто мына самом деле определили три разных класса для этих трех типов данных.template <class elemType>class Array {public:explicit Array( int sz = DefaultArraySize );Array( const elemType *ar, int sz );Array( const Array &iA );virtual ~Array() { delete[] _ia; }Array& operator=( const Array & );int size() const { return _size; }virtual elemType& operator[]( int ix ){ return _ia[ix]; }virtual void sort( int,int );virtual int find( const elemType& );virtual elemType min();virtual elemType max();protected:void init( const elemType*, int );void swap( int, int );static const int DefaultArraySize = 12;int_size;elemType *_ia;Вот как может выглядеть шаблон класса Array:};Ключевое слово template говорит о том, что задается шаблон, параметры которогозаключаются в угловые скобки (<>).

В нашем случае имеется лишь один параметрelemType; ключевое слово class перед его именем сообщает, что этот параметрпредставляет собой тип.При конкретизации класса-шаблона Array параметр elemType заменяется на реальныйтип при каждом использовании, как показано в примере:55С++ для начинающих56#include <iostream>#include "Array.h"int main(){const int array_size = 4;// elemType заменяется на intArray<int> ia(array_size);// elemType заменяется на doubleArray<double> da(array_size);// elemType заменяется на charArray<char> ca(array_size);int ix;for ( ix = 0; ixia[ix] =da[ix] =ca[ix] =}< array_size; ++ix ) {ix;ix * 1.75;ix + 'a';for ( ix = 0; ix < array_size; ++ix )cout << "[ " << ix << " ] ia: " << ia[ix]<< "\tca: " << ca[ix]<< "\tda: " << da[ix] << endl;return 0;}Array<int> ia(array_size);Здесь определены три экземпляра класса Array:Array<double> da(array_size);Array<char> ca(array_size);Что делает компилятор, встретив такое объявление? Подставляет текст шаблона Array,заменяя параметр elemType на тот тип, который указан в каждом конкретном случае.Следовательно, объявления членов приобретают в первом случае такой вид:// Array<int> ia(array_size);int _size;int *_ia;Заметим, что это в точности соответствует определению массива IntArray.// Array<double> da(array_size);Для оставшихся двух случаев мы получим следующий код:int_size;double *_ia;С++ для начинающих57// Array<char> ca(array_size);int_size;char *_ia;Что происходит с функциями-членами? В них тоже тип-параметр elemType заменяетсяна реальный тип, однако компилятор не конкретизирует те функции, которые невызываются в каком-либо месте программы.

(Подробнее об этом в разделе 16.8.)При выполнении программа этого примера выдаст следующий результат:[[[[0123]]]]ia:ia:ia:ia:0123ca:ca:ca:ca:abcdda:da:da:da:01.753.55.25Механизм шаблонов можно использовать и в наследуемых классах. Вот как выглядит#include <cassert>определение шаблона класса ArrayRC:#include "Array.h"template <class elemType>class ArrayRC : public Array<elemType> {public:ArrayRC( int sz = DefaultArraySize ): Array<elemType>( sz ) {}ArrayRC( const ArrayRC& r ): Array<elemType>( r ) {}ArrayRC( const elemType *ar, int sz ): Array<elemType>( ar, sz ) {}elemType& ArrayRC<elemType>::operator[]( int ix ){assert( ix >= 0 && ix < Array<elemType>::_size );return _ia[ ix ];}private:// ...};Подстановка реальных параметров вместо типа-параметра elemType происходит как вбазовом, так и в производном классах.

ОпределениеArrayRC<int> ia_rc(10);ведет себя точно так же, как определение IntArrayRC из предыдущего раздела. Изменим// функцию swap() тоже следует сделать шаблономпример использования из предыдущего раздела. Прежде всего, чтобы операторswap( ia1, 1, ia1.size() );был допустимым, нам потребуется представить функцию swap() в виде шаблона.С++ для начинающих#include "Array.h"template <class elemType>inline voidswap( Array<elemType> &array, int i, int j ){elemType tmp = array[ i ];array[ i ] = array[ j ];array[ j ] = tmp;}При каждом вызове swap() генерируется подходящая конкретизация, которая зависит от#include <iostream>типа массива. Вот как выглядит программа, использующая шаблоны Array и ArrayRC:#include "Array.h"#include "ArrayRC.h"template <class elemType>inline voidswap( Array<elemType> &array, int i, int j ){elemType tmp = array[ i ];array[ i ] = array[ j ];array[ j ] = tmp;}int main(){Array<int>ia1;ArrayRC<int> ia2;cout << "swap() with Array<int> ia1" << endl;int size = ia1.size();swap( ia1, 1, size );cout << "swap() with ArrayRC<int> ia2" << endl;size = ia2.size();swap( ia2, 1, size );return 0;}Упражнение 2.13template<class elemType> class Array;Пусть мы имеем следующие объявления типов:enum Status { ...

};typedef string *Pstring;Есть ли ошибки в приведенных ниже описаниях объектов?58С++ для начинающих(a) Array< int*& > pri(1024);(b) Array< Array<int> > aai(1024);(c) Array< complex< double > > acd(1024);(d) Array< Status > as(1024);(e) Array< Pstring > aps(1024);Упражнение 2.14class example1 {public:example1 (double min, double max);example1 (const double *array, int size);double& operator[] (int index);bool operator== (const example1&) const;bool insert (const double*, int);bool insert (double);double min (double) const { return _min; };double max (double) const { return _max; };void min (double);void max (double);int count (double value) const;private:int size;double *parray;double _min;double _max;Перепишите следующее определение, сделав из него шаблон класса:}Упражнение 2.15template <class elemType> class Example2 {Имеется следующий шаблон класса:public:explicit Example2 (elemType val=0) : _val(val) {};bool min(elemType value) { return _val < value; }void value(elemType new_val) { _val = new_val; }void print (ostream &os) { os << _val; }private:elemType _val;}template <class elemType>59С++ для начинающихostream& operator<<(ostream &os,const Example2<elemType> &ex){ ex.print(os); return os; }(a) Example2<Array<int>*> ex1;(b) ex1.min (&ex1);(c) Example2<int> sa(1024),sb;(d) sa = sb;(e) Example2<string> exs("Walden");Какие действия вызывают следующие инструкции?(f) cout << "exs: " << exs << endl;Упражнение 2.16Пример из предыдущего упражнения накладывает определенные ограничения на типыданных, которые могут быть подставлены вместо elemType.

Характеристики

Тип файла
PDF-файл
Размер
5,41 Mb
Тип материала
Высшее учебное заведение

Список файлов книги

Свежие статьи
Популярно сейчас
А знаете ли Вы, что из года в год задания практически не меняются? Математика, преподаваемая в учебных заведениях, никак не менялась минимум 30 лет. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6367
Авторов
на СтудИзбе
309
Средний доход
с одного платного файла
Обучение Подробнее