Освой самостоятельно С++ за 21 день.
Шрифт:
Такие указатели используются достаточно редко. Это дело вкуса программиста. Даже в сложных и мощных программах без них можно вполне обойтись.
Коллоквиум
В этом разделе предлагаются вопросы для самоконтроля и укрепления полученных знаний и приводится несколько упражнений, которые помогут закрепить ваши практические навыки. Попытайтесь самостоятельно ответить на вопросы теста и выполнить задания, а потом сверьте полученные результаты с ответами в приложении Г. Не приступайте к изучению
Контрольные вопросы
1. Могут ли статические переменные-члены быть закрытыми?
2. Объявите статическую переменную-член.
3. Объявите статическую функцию.
4. Объявите указатель на функцию, принимающую параметр типа int и возвращающую значение типа long.
5. Измените указатель, созданный в задании 4, на указатель на функцию-член класса Car.
6. Объявите массив из десяти указателей, созданных в задании 5.
Упражнения
1. Напишите короткую программу, объявляющую класс с одной обычной переменной-членом и одной статической переменной-членом. Создайте конструктор, выполняющий инициализацию переменной-члена и приращение статической переменной-члена. Затем опишите деструктор, который уменьшает на единицу значение статической переменной.
2. Используя программный блок из упражнения 1, напишите короткую выполняемую программу, которая создает три объекта, а затем выводит значения их переменных-членов и статической переменной-члена класса. Затем последовательно удаляйте объекты и выводите на экран значение статической переменной-члена.
3. Измените программу упражнения 2 таким образом, чтобы доступ к статической переменной-члену осуществлялся с помощью статической функции-члена. Сделайте статическую переменную-член закрытой.
4. Создайте в программе упражнения 3 указатель на функцию-член для доступа к значению нестатической переменной-члена и воспользуйтесь им для вывода этих значений на печать.
5. Добавьте две дополнительные переменные-члена к классу из предыдущих заданий. Добавьте методы доступа, возвращающие значения всех этих переменных. Все функции-члены должны возвращать значения одинакового типа и иметь одинаковую сигнатуру. Для доступа к этим методам используйте указатель на функцию-член.
Подведение итогов
В этой главе вашему вниманию предлагается достаточно мощная программа, в которой используется большинство средств и подходов программирования, освоенных вами в течение двух недель.
В этой программе используются связанные списки, виртуальные функции, чистые виртуальные функции, замещения функций, полиморфизм, открытое наследование, перегрузка функций, вечные циклы, указатели, ссылки и многие другие знакомые вам средства. Обратите внимание, что представленный здесь связанный список отличается от рассмотренных ранее. Язык C++ предоставляет множество способов достижения одной и той же цели.
Цель данной программы
состоит в создании функционального связанного списка. В узлах созданного списка можно хранить записи о деталях и агрегатах, что позволяет использовать его в реальных прикладных программах баз данных складов. Хотя здесь представлена не окончательная форма программы, она достаточно хорошо демонстрирует возможности создания совершенной структуры накопления и обработки данных. Листинг программы содержит 311 строк. Попробуйте самостоятельно проанализировать код, прежде чем прочтете анализ, приведенный после листинга.Итоги второй недели
1: // **********************************
2: //
3: // Название: Подведение итогов
4: //
5: // Файл: Week2
6: //
7: // Описание: Демонстрация создания и использования связанного списка
8: //
9: // Классы: PART - содержит идентификационный
10: // номер детали и обеспечивает возможность
11: // добавлять другие данные
12: // PartNode - функционирует как узел в PartsList
13: //
14: // PartsList - реализует механизм связывания
15: // узлов в список
16: //
17: // **********************************
18:
19: #include <iostream.h>
20:
21:
22:
23: // **************** Part ************
24:
25: // Абстрактный базовый класс, общий для всех деталей
26: class Part
27: {
28: public:
29: Part:itsPartNumber(1) { }
30: Part(int PartNumber):itsPartNumber(PartNumber) { }
31: virtual ~Part { };
32: int GetPartNumber const { return itsPartNumber; }
33: virtual void Display const =0; // должна быть замещена как private
34: private:
35: int itsPartNumber;
36: };
37:
38: // выполнение чистой виртуальной функции в
39: // стандартном виде для всех производных классов
40: void Part::Display const
41: {
42: cout << "\nНомер детали: " << itsPartNumber << endl;
43: }
44:
45: // ************* Автомобильные детали **********
46:
47: class CarPart : public Part
48: {
49: public:
50: CarPart:itsModelYear(94){ }
51: CarPart(int year, int partNumber);
52: virtual void Display const
53: {
54: Part::Display; cout << "Год создания: ";
55: cout << itsModelYear << endl;
56: }
57: private:
58: int itsModelYear;
59: };
60:
61: CarPart::CarPart(int year, int partNumber):
62: itsModelYear(year),
63: Part(partNumber)
64: { }
65:
66:
67: // ************* Авиационные детали **********
68:
69: class AirPlanePart : public Part
70: {
71: public:
72: AirPlanePart:itsEngineNumber(1){ } ;
73: AirPlanePart(int EngineNumber, int PartNumber);
74: virtual void Display const