Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ТП лекции Раздел 4.doc
Скачиваний:
16
Добавлен:
28.09.2019
Размер:
2.56 Mб
Скачать

4.9.3. Абстрактные методы и классы.

Абстрактный класс содержит по крайней мере одну чисто виртуальную функцию. Чисто виртуальная функция объявляется путем указания =0 в конце ее объявления.

// Example of a virtual function and abstract classes

#include <iostream.h>

class Shape // Абстрактный класс

{

public:

  virtual void draw() = 0; // Чисто виртуальная функция

};

class Rectangle: public Shape

{

public:

  void draw();

};

class Circle : public Shape

{

public:

  void draw();

};

Объекты абстрактного класса не могут существовать. Однако указатель или ссылка на него могут быть созданы. Объект абстрактного класса не может быть в качестве типа возвращае­мого функцией значения и в качестве параметра функции. Если в абстрактном классе объявлена чисто виртуальная функция и она не переопределена (overriden) в производном классе, то этот производный класс тоже становится абстракт­ным, так как он наследовал чисто виртуальную функцию. Абстрактные классы используются только для того, чтобы от них могли быть образованы производ­ные классы. Это своеобразный генетический материал для будущих классов. Обычно они стоят во главе иерархического дерева классов. Конструктор абст­рактного класса служит не для создания объектов своего класса, а для инициа­лизации объектов производных (не абстрактных классов). Точнее, именно тех полей производного класса, которые перешли по наследству от абстрактного. Методы абстрактного класса могут быть вызваны в теле конструктора, исклю­чая, конечно, чисто виртуальные функции.

Тема 4.10. Операции ввода/вывода данных в Visual C++.

4.10.1. Функции консольного ввода-вывода.

В файле conio.h содержатся прототипы библиотечных функций ввода с клавиатуры и вывода на экран в текстовом режиме монитора. Клавиатура и дисплей и совокупности обозначаются термином "консоль" (console), поэтому принято говорить о вводе с консоли. Функция getch служит для ввода одного символа с консоли. Таким образом осуществляется задержка в выполнении программы и ожидание реакции пользователя на программное сообщение. Это не очень надежный способ, но он достаточно распространен среди программистов ввиду своей простоты. Вызов fflush(stdin), очищает буфер ввода, что повышает надежность работы scanf при ошибочных попытках ввода. Конструкция

if (!getch()) getch();

дает пользователю время для восприятия сообщения и работает несколько надежнее, чем просто getch();. Функция getch выбирает один байт из входного потока stdin, оставляя в буфере ввода второй байт, если он был. Служебные символы, в отличие от обычных, дают двухбайтный код с нулевым первым байтом. Оператор if (!getch()) getch()), "съедает" содержимое буфера ввода, даже если пользователь нажмет клавишу служебною символа. Именно это обстоятельство используется при вычислении условия if(!getch()). Рассмотренный трюк действует только при компиляции программы для платформы DOS, так как Windows перехватывает и сама обрабатывает служебные символы.

Функция scanf предназначена для форматируемого ввода из потока stdin, который по умолчанию закреплен за клавиатурой. Аргумент "%d" указывает, что ожидается целое число в десятичной форме. Второй аргумент &n означает, что в функцию scanf передается адрес переменной int n, как она (функция scanf) того и требует. Благодаря этому scanf в состоянии изменить содержимое по переданному адресу, то есть значение переменной n.

В функциях printf и scanf спецификаторы %d, %f, %5.2f определяют формат, в котором выводится число или ожидается вводимое число. Например, оператор

printf(". .%d. .%f. .",i,а);

следует интерпретировать так. Любой текст, обозначенный точками, выводится так, как он есть. Вместо %d подставляется числовое значение первого параметра из списка, следующего за второй закрывающей двойной кавычкой, то есть значение переменной i. Далее опять выводится текст, стоящий в строке между %d и %f, затем вместо %f подставляется числовое значение следующей переменной из списка, то есть переменной а, и т. д. Спецификатор формата %f используется для переменных типов float и double, спецификатор %d - для целых чисел.

В операторе scanf ("%f", &x[i]); & в данном контексте означает операцию взятия адреса. Адрес 1-го элемента массива х[] передается в функцию scanf, которая записывает по этому адресу значение числа, введенное пользователем с консоли. В случае ошибочного ввода реакция программы зависит только от возможностей библиотечной процедуры scanf. Такое положение вещей не всегда устраивает разработчика ПО, поэтому он часто включает свои собственные проверки введенной информации на удовлетворение разумным ограничениям.