Указатели на компоненты-функции
Можно определить указатель на компоненты-функции.
тип_возвр_значения(имя_класса::*имя_указателя_на_функцию) (специф_параметров_функции);
Пример.
double(complex : :*ptcom)(); // Определение указателя
ptcom = &complex : : real; // Настройка указателя
// Теперь для объекта А можно вызвать его функцию
complex A(5.2,2.7);
cout<<(A.*ptcom)();
Порядок выполнения работы.
4. 1Определить пользовательский класс в соответствии с вариантом задания (смотри приложение).
5. Определить в классе следующие конструкторы: без параметров, с параметрами, копирования.
6. Определить в классе деструктор.
7. Определить в классе компоненты-функции для просмотра и установки полей данных.
8. Определить указатель на компоненту-функцию.
9. Определить указатель на экземпляр класса.
10. Написать демонстрационную программу, в которой создаются и разрушаются объекты пользовательского класса и каждый вызов конструктора и деструктора сопровождается выдачей соответствующего сообщения (какой объект какой конструктор или деструктор вызвал).
11. Показать в программе использование указателя на объект и указателя на компоненту-функцию.
Методические указания.
Пример определения класса.
const int LNAME=25;
class STUDENT{
char name[LNAME]; // имя
int age; // возраст
float grade; // рейтинг
public:
STUDENT(); // конструктор без параметров
STUDENT(char*,int,float); // конструктор с параметрами
STUDENT(const STUDENT&); // конструктор копирования
~STUDENT();
char * GetName() ;
int GetAge() const;
float GetGrade() const;
void SetName(char*);
void SetAge(int);
void SetGrade(float);
void Set(char*,int,float);
void Show(); };
Более профессионально определение поля name типа указатель: char* name. Однако в этом случае реализация компонентов-функций усложняется.
2. Пример реализации конструктора с выдачей сообщения.
STUDENT::STUDENT(char*NAME,int AGE,float GRADE)
{
strcpy(name,NAME); age=AGE; grade=GRADE;
cout<< \nКонструктор с параметрами вызван для объекта <<this<<endl;
}
3. Следует предусмотреть в программе все возможные способы вызова конструктора копирования. Напоминаем, что конструктор копирования вызывается:
а) при использовании объекта для инициализации другого объекта
Пример.
STUDENT a(“Иванов”,19,50), b=a;
б) когда объект передается функции по значению
Пример.
void View(STUDENT a){a.Show;}
в) при построении временного объекта как возвращаемого значения функции
Пример.
STUDENT NoName(STUDENT & student)
{STUDENT temp(student);
temp.SetName(“NoName”);
return temp;}
STUDENT c=NoName(a);
4. В программе необходимо предусмотреть размещение объектов как в статической, так и в динамической памяти, а также создание массивов объектов.
Пример.
а) массив студентов размещается в статической памяти
STUDENT gruppa[3];
gruppa[0].Set(“Иванов”,19,50);
и т.д.
или
STUDENT gruppa[3]={STUDENT(“Иванов”,19,50),
STUDENT(“Петрова”,18,25.5),
STUDENT(“Сидоров”,18,45.5)};
б) массив студентов размещается в динамической памяти
STUDENT *p;
p=new STUDENT [3];
p-> Set(“Иванов”,19,50);
и т.д.
5. Пример использования указателя на компонентную функцию
void (STUDENT::*pf)();
pf=&STUDENT::Show;
(p[1].*pf)();
Содержание отчета.
1. Титульный лист: название дисциплины; номер и наименование работы; фамилия, имя, отчество студента; дата выполнения.
2. Постановка задачи. Следует дать конкретную постановку, т.е. указать, какой класс должен быть реализован, какие должны быть в нем конструкторы, компоненты-функции и т.д.
3. Определение пользовательского класса с комментариями.
4. Реализация конструкторов и деструктора.
5. Фрагмент программы, показывающий использование указателя на объект и указателя на функцию с объяснением.
6. Листинг основной программы, в котором должно быть указано, в каком месте и какой конструктор или деструктор вызываются.
Контрольные вопросы
1. Понятия class и struct?
2. Параметры видимости компонент в определении класса.
3. Что такое инкапсуляция?
4. Что такое конструктор, зачем он нужен, когда вызывается?
5. Что такое деструктор, зачем он нужен, когда вызывается?
6. В чем особенность и когда нужен конструктор копирования?
7. Операции new и delete.
8. This, его назначение и применение.
9. Inline функции;
10. Особенности работы с массивами классов.
Варианты
Описания членов - данных пользовательских классов
Вариант 1.
АВТОМОБИЛЬ
марка – char*
модель – char*
производитель – char*
мощность – int
стоимость – float
Вариант 2.
КАТАЛОГ ЭВМ
тип процессора – char*
тактовая частота – float
объем оп. памяти – int
емкость винчестера – float
Вариант 3.
ШКОЛА
название-char*
тип -char*
адрес - char*
количество учеников –int
количество учителей –int
Вариант 4.
САМОЛЕТ
марка – char*
модель – char*
производитель – char*
тип – char*
дальность полета – float
Вариант 5.
ТЕЛЕФОН
модель – char*
производитель – char*
стандарт – char*
стоимость – float
Вариант 6.
СТУДЕНТ
фамилия – char*
имя – char*
отчество– char*
курс – int
группа– char*
Вариант 7.
РАБОТНИК
фамилия – char*
имя – char*
отчество– char*
возраст – int
рабочий стаж – int
Вариант 8.
ИЗДЕЛИЕ
наименование – char*
шифр – char*
тип упаковки– char*
количество – int
Вариант 9.
КАДРЫ
фамилия – char*
имя – char*
отчество– char*
номер цеха – int
разряд – int
Вариант 10.
АДРЕС
страна – char*
город– char*
улица – char*
номер дома – int
Вариант 11.
КОРАБЛЬ
имя – char*
водоизмещение – int
численность команды -int
тип – char*
Вариант 12.
ЦЕХ
название – char*
фамилия начальника – char*
количество
работающих – int
Вариант 13.
КАТАЛОГ ПРИНТЕРОВ
производитель – char*
тип – char*
объем оп. памяти – int
скорость печати – float
Вариант 14.
СТРАНА
название – char*
форма
правления – char*
площадь – float
население – float
Вариант 15.
РАСТЕНИЕ
название– char*
класс – char*
среднее время жизни – int
место произрастания – char*
Вариант 16.
КНИЖНЫЙ МАГАЗИН
название – char*
тематика – char*
автор – char*
стоимость – float
Вариант 17.
ТОВАР
наименование – char*
единицы измерения – char*
количество – float
цена-float
стоимость – float
Вариант 18.
ПЕРСОНА
фамилия – char*
имя – char*
отчество– char*
возраст – int
пол – int(bool)
Вариант 19.
ЖИВОТНОЕ
название – char*
класс – char*
средний вес – int
страна обитания –char*
Вариант 20.
ЭКЗАМЕН
имя студента – char*
группа – char*
дата – int
оценка – int
Лабораторная работа № 12
«ПЕРЕГРУЗКА ОПЕРАЦИЙ И ФУНКЦИЙ В С++»
Цель. Получить практические навыки реализации перегрузки операций и функций на С++.