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

1 ... 158 159 160 [ 161 ] 162 163 164 ... 265


149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166

temp[i] = rhs[i-itsLen]; tenp[totalLen]=\ 0; this = temp;

int String::ConstructorCount =

ostream& operator ( ostrea(n& theStream, Strings theString) {

theStream theString.itsString; return theStream;

int mainO {

String theStringCHello world. ); cout << theString; return 0;

Hello world.

В строке 19 operator объявляется как функция-друг, которая принимает ссылки на ostream и String и возвращает ссылку на ostream. Обратите внимание, что она не является функцией-членом класса string. Поскольку эта функция возвращает ссылку на ostream, можно конкатенировать вызовы operator следующим образом;

cout << myAge: << itsAge << years. ;

Выполнение этой функции-друга представлено строками 155-159. Основное назначение функции состоит в том, чтобы скрыть детали процедуры передачи строки в iostream. Больше ничего и не требуется. Более подробно о функции ввода и перегрузке operator вы узнаете на следующем занятии.

Резюме

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

Вы также узнали, как объявлять классы и функции-друзьями другого класса. Объявление функции друга позволяет перефузить оператор ввода таким образом, что появляется возможность использовать объект cout в пользовательском классе точно так же, как в стандартных встроенных классах.

Напомним, что открытое наследования определяет производный класс как уточнение базового класса; вложение подразумевает обладание одним классом объектами другого класса, а закрытое наследование состоит в вьшолнении одного класса средствами другого класса. Делегирование ответственности реализуется либо вложением, либо закрытым наследованием, хотя первое предпочтительнее.



Вопросы u отееты

Почему так важно разбираться в особенностях отношений между классами при выборе различных подходов установки взаимосвязей между ними?

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

Почему вложение предпочтительнее закрытого наследования?

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

Почему бы не описать все классы, объекты которых используются в других классах, друзьями этих классов?

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

Если функция перефужается, нужно ли описывать каждый вариант этой функции другом класса?

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

Коллоквиум

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

Контрольные вопросы

1. Как объявить класс, являющийся частным проявлением другого класса?

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

3. В чем состоят различия между вложением и делегированием?

4. В чем состоят различия между делегированием и выполнением класса в пределах другого класса?



5. Что такое функция-друг?

6. Что такое класс-друг?

7. Если класс Dog является другом Boy, то можно ли сказать, что Boy - друг Dog?

8. Если класс Dog является другом Boy, а Terrier произведен от Dog, является ли Terrier другом Boy?

9. Если класс Dog является другом Boy, а Boy - другом House, можно ли считать Dog другом House?

10. Где необходимо размещать объявление функции-друга?

Упражнения

1. Объявите класс Animal, который содержит переменную-член, являющуюся объектом класса String.

2. Объявите класс BoundedArray, являющийся массивом.

3. Объявите класс Set, выполняемый в пределах массива BoundedArray.

4. Измените листинг 15.1 таким образом, чтобы класс string включал перефуженный оператор вывода ( ).

5. Жучки: найдите ошибки в этом коде:

ftinclude <iostream.h>

1 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

class Animal;

void setValue(Animal& , int);

class Animal {

public:

int GetWeightOconst { return itsWeight; }

int GetAgeO const { return itsAge; } private:

int itsWeight;

int itsAge; } ;

void setValue(Animal& theAnimal, int theWeight) {

friend class Animal;

theAnimal.itsWeight = theWeight;

int mainO {

Animal peppy; setValue(peppy,5);



1 ... 158 159 160 [ 161 ] 162 163 164 ... 265

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