Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Либерти Джесс. Освой самостоятельно С++ за 21 день. - royallib.ru.rtf
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
2.55 Mб
Скачать

Вопросы и ответы

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

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

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

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

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

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

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

Да. Если вы перегружаете функцию и хотите представить все варианты этой функции друзьями другого класса, то в описании класса каждый вариант функции должен сопровождаться ключевым словом 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. Жучки: найдите ошибки в этом коде:

   1: #include <iostream.h>

   2:

   3: class Animal;

   4:

   5: void setValue(Animal& , int);

   6:

   7:

   8: class Animal

   9: {

   10:   public:

   11:      int GetWeight()const { return itsWeight; }

   12:      int GetAge() const { return itsAge; }

   13:   private:

   14:      int itsWeight;

   15:      int itsAge;

   16: };

   17:

   18: void setValue(Animal& theAnimal, int theWeight)

   19: {

   20:    friend class Animal;

   21:    theAnimal.itsWeight = theWeight;

   22: }

   23:

   24: int main()

   25: {

   26:    Animal peppy;

   27:    setValue(peppy,5);

   28: }

6. Исправьте листинг, приведенный в упражнении 5, и откомпилируйте его.

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

   1: #include<iostream.h>

   2:

   3: class Animal;

   4:

   5: void setValue(Animal& , int);

   6: void setValue(Animal&. ,int,int);

   7:

   8: class Animal

   9: {

   10:   friend void setValue(Animal& ,int);

   11:   private:

   12:      int itsWeight;

   13:      int itsAge;

   14: };

   15:

   16: void setValue(Animal& theAnimal, int theWeight)

   17: {

   18:    theAnimal.itsWeight = theWeight;

   19: }

   20:

   21:

   22: void setValue(Animal& theAnimal, int theWeight, int theAge)

   23: {

   24:    theAnimal.itsWeight = theWeight;

   25:    theAnimal.itsAge = theAge;

   26: }

   27:

   28: int main()

   29: {

   30:    Animal peppy;

   31:    setValue(peppy,5);

   32:    setValue(peppy, 7, 9);

   33: }

8. Исправьте листинг, приведенный в упражнении 7, и откомпилируйте его.