- •ПРОГРАММИРОВАНИЕ НА ЯЗЫКАХ С И С++
- •СОДЕРЖАНИЕ
- •ВВЕДЕНИЕ
- •1. ЛЕКСИКА ЯЗЫКА C
- •1.1. РАЗДЕЛИТЕЛИ
- •1.2. КОММЕНТАРИИ
- •2. ДАННЫЕ И ОПЕРАЦИИ
- •2.1. БАЗОВЫЕ ТИПЫ ДАННЫХ
- •Наименование
- •Диапазон
- •2.2. КОНСТАНТЫ
- •Целые константы
- •Константы с плавающей точкой
- •Символьные константы
- •2.3. ОПРЕДЕЛЕНИЕ ПЕРЕМЕННЫХ И ТИПИЗИРОВАННЫХ КОНСТАНТ
- •2.4. ОДНОМЕРНЫЙ МАССИВ
- •2.5. СТРОКИ, СТРОКОВЫЕ КОНСТАНТЫ
- •2.6. УКАЗАТЕЛИ
- •2.7. ПЕРЕИМЕНОВАНИЯ ТИПОВ
- •2.8. СТРУКТУРЫ
- •2.9. МАССИВЫ СТРУКТУР
- •2.10. МНОГОМЕРНЫЕ МАССИВЫ
- •2.11. ОБЪЕДИНЕНИЕ
- •2.12. ПЕРЕЧИСЛЕНИЕ
- •2.13. БИТОВОЕ ПОЛЕ ( ЗАПИСЬ )
- •3. ОПЕРАЦИИ И ВЫРАЖЕНИЯ
- •3.1. АРИФМЕТИЧЕСКИЕ ОПЕРАЦИИ
- •3.2. ОПЕРАЦИИ СРАВНЕНИЯ
- •3.3. ЛОГИЧЕСКИЕ ОПЕРАЦИИ
- •3.4. ПОБИТОВЫЕ (ПОРАЗРЯДНЫЕ) ОПЕРАЦИИ
- •3.5. ОПЕРАЦИИ ПРИСВАИВАНИЯ
- •3.6. АДРЕСНЫЕ ОПЕРАЦИИ
- •3.7. ДОСТУП К ПОЛЯМ СТРУКТУР, ОБЪЕДИНЕНИЙ И ЗАПИСЕЙ
- •3.8. ДРУГИЕ ОПЕРАЦИИ
- •3.9. ПОРЯДОК ВЫПОЛНЕНИЯ ОПЕРАЦИЙ В ВЫРАЖЕНИИ
- •4. ОПЕРАТОРЫ
- •4.1. ОПЕРАТОР-ВЫРАЖЕНИЕ
- •4.2. ПУСТОЙ ОПЕРАТОР
- •4.3. СОСТАВНОЙ ОПЕРАТОР
- •4.4. УСЛОВНЫЕ ОПЕРАТОРЫ
- •4.5. ОПЕРАТОРЫ ЦИКЛА
- •while( выражение) оператор;
- •do оператор while ( выражение );
- •for( выражение1; выражение2; выражение3 ) оператор;
- •4.6. ОПЕРАТОРЫ ПЕРЕХОДА
- •break;
- •switch
- •continue;
- •goto метка;
- •5. ФУНКЦИИ. КЛАССЫ ПАМЯТИ
- •5.1. ФУНКЦИИ
- •5.2. КЛАССЫ ПАМЯТИ
- •класс памяти
- •ключевое слово
- •существование
- •видимость
- •5.3. ВОЗВРАЩЕНИЕ ЗНАЧЕНИЙ
- •5.4. АРГУМЕНТЫ ФУНКЦИИ
- •6. ФУНКЦИИ ВВОДА С КЛАВИАТУРЫ И ВЫВОДА НА ДИСПЛЕЙ
- •6.1. ФОРМАТИРОВАННЫЙ ВЫВОД
- •6.2. ФОРМАТИРОВАННЫЙ ВВОД
- •6.3. ВВОД СТРОКИ
- •6.4. ВЫВОД СТРОКИ
- •6.5. ВВОД СИМВОЛА
- •6.6. ВЫВОД СИМВОЛА
- •7. ПРЕПРОЦЕССОР
- •7.1. ВКЛЮЧЕНИЕ ФАЙЛОВ
- •7.2. ВЫПОЛНЕНИЕ ПОДСТАНОВОК
- •7.3. УСЛОВНАЯ КОМПИЛЯЦИЯ
- •8. ДИНАМИЧЕСКОЕ РАСПРЕДЕЛЕНИЕ ПАМЯТИ, СПИСКИ
- •8.1. ВЫДЕЛЕНИЕ И ОСВОБОЖДЕНИЕ ДИНАМИЧЕСКОЙ ПАМЯТИ
- •8.2. СПИСКИ
- •Рис.1. Структура однонаправленного линейного списка
- •9. ФАЙЛЫ
- •9.1. ОТКРЫТИЕ И ЗАКРЫТИЕ ФАЙЛОВ
- •9.2. ЧТЕНИЕ И ЗАПИСЬ В ФАЙЛ
- •9.3. ПРОИЗВОЛЬНЫЙ ДОСТУП К ФАЙЛУ
- •10. ЛАБОРАТОРНЫЕ РАБОТЫ
- •10.1. МАССИВЫ И СИМВОЛЬНЫЕ СТРОКИ
- •Цель работы
- •Пример выполнения работы
- •Варианты заданий
- •10.2. ФУНКЦИИ
- •Цель работы
- •Пример выполнения работы
- •Варианты заданий
- •10.3. СТРУКТУРЫ И МАССИВЫ СТРУКТУР
- •Цель работы
- •Пример выполнения работы
- •Варианты заданий
- •10.4. ДИНАМИЧЕСКОЕ РАСПРЕДЕЛЕНИЕ ПАМЯТИ, СПИСКИ
- •Цель работы
- •Пример выполнения работы
- •Варианты заданий
- •10.5. РАБОТА С ФАЙЛАМИ
- •Цель работы
- •Пример выполнения работы
- •Варианты заданий
- •11. ВВЕДЕНИЕ В C++
- •12. КЛАССЫ
- •12.1. ОБЩИЕ ПОЛОЖЕНИЯ
- •12.2. КОНСТРУКТОРЫ И ДЕСТРУКТОРЫ
- •12.3. СОЗДАНИЕ И ВЫЗОВ ОБЪЕКТОВ
- •12.4. ДРУЖЕСТВЕННЫЕ ФУНКЦИИ
- •12.5. ПЕPЕГPУЖЕННЫЕ ОПЕPАЦИИ И ФУНКЦИИ
- •12.6. ПАРАМЕТРИЗИРОВАННЫЕ КЛАССЫ
- •12.7. ПРЕОБРАЗОВАНИЕ ТИПОВ
- •12.8. СТАТИЧЕСКИЕ КОМПОНЕНТЫ КЛАССА
- •13. ПРОИЗВОДНЫЕ КЛАССЫ, НАСЛЕДОВАНИЕ
- •13.1. ИЕРАРХИЯ КЛАССОВ
- •13.2. ДОСТУП К НАСЛЕДУЕМЫМ КОМПОНЕНТАМ
- •Доступ в базовом классе
- •Модификатор доступа
- •14. ВИРТУАЛЬНЫЕ ФУНКЦИИ
- •14.1. ОБЩИЕ ПОЛОЖЕНИЯ
- •14.2. ВИРТУАЛЬНЫЕ ДЕСТРУКТОРЫ
- •14.3. АБСТРАКТНЫЕ КЛАССЫ
- •15.1. ВЫВОД ДАННЫХ
- •15.2. ВВОД ДАННЫХ
- •15.3. ВВОД-ВЫВОД ДАННЫХ, ОПРЕДЕЛЕННЫХ ПОЛЬЗОВАТЕЛЕМ
- •15.4. РАБОТА С ДИСКОВЫМИ ФАЙЛАМИ
- •15.5. ОБРАБОТКА ИСКЛЮЧЕНИЙ
- •ЛИТЕРАТУРА
– 47 –
//Статическая функция
static void f() {cout<<“Я - статическая функция”<<a<<endl; } };
int MyClass::a=66;// Инициализация статической переменной void main() {
MyСlass mc; MyСlass::f(); mc.f();
f();
}
Вид информации на экране дисплея:
Я- статическая функция 66
Я- статическая функция 66
Я- глобальная функция
13. ПРОИЗВОДНЫЕ КЛАССЫ, НАСЛЕДОВАНИЕ
13.1. ИЕРАРХИЯ КЛАССОВ
Производные классы являются эффективным средством для расширения функциональных возможностей существующих классов без перепрограммирования этих классов и повторной компиляции существующих программ.
Сконструируем класс Person на основе двух классов: Name и Job. Иерархия классов выглядит следующим образом:
Name |
Job |
Person
Классы Name и Job называются базовыми для производного класса Person. Поля и функции, которые определены в базовых классах, могут быть использованы в производном. Использование компонентов базовых классов в производных называется наследованием. Программа выглядит следующим образом:
struct Name{
char *FirstName; // Имя char *SurName; // Фамилия Name( char *Fn, char *Sn );
{ cout<<”Конструктор класса Name”<<endl; FirstName=Fn; SurName=Sn;}
~Name() { cout<<”Деструктор класса Name”<<endl; } };
struct Job{
char *Company; //Название компании char *Position; // Должность
Job (char *Co, char *Po)
{ cout<<”Конструктор класса Job”<<endl; Company=Co; Position=Po;}
~Job() { cout<<”Деструктор класса Job”<<endl; } };
struct Person: Name, Job {
// Собственные компоненты производного класса int Age; // возраст
char Sex; // пол
Person ( char *Ifn, char *Isn, char *Ico, char *Ipo, int Ia, char *Is): Name (Ifn, Isn), Job(Ico, Ipo) // Список конструкторов базовых классов
{cout<<”Конструктор класса Person”<<endl; Age=Ia; Sex=Is;}
~Person() {cout<<”Деструктор класса Job”<<endl; }
© 1998 Калачев Д.П., Лутай В.Н.
– 48 –
};
void main() {
Person Pl (”Владимир”, ”Сидоров”, ”SoftSci”, ”Программист”, 30, ”муж” );
}
Благодаря наследованию поля FirstName, SurName, Company и Position, определенные в базовых классах, доступны в производном. Доступны в этом классе и конструкторы базового класса.
В примере приведено так называемое множественное наследование – один производный класс имеет несколько базовых; в то же время один класс может быть базовым для нескольких производных, производный класс может быть, в свою очередь, базовым для какоголибо класса и т.д. Принято называть базовый класс родительским, а производный класс – потомком.
При создании объектов производного класса сначала автоматически вызываются конструкторы базовых классов согласно списку базовых классов в объявлении производного класса, а затем конструктор производного класса. Конструкторы базовых классов вызываются независимо от того, перечислены они явно в конструкторе производного класса, как в нашем случае, или нет.
Объекты разрушаются в порядке, обратном их созданию, т.е. вначале вызывается деструктор производного класса, а затем базовых. При запуске приведенной программы выведенная информация будет иметь следующий вид:
Конструктор класса Name Конструктор класса Job Конструктор класса Person Деструктор класса Person Деструктор класса Job Деструктор класса Name
В базовом и производном классах функции могут иметь одно и то же имя и список параметров, но отличаться текстом (Такие функции называют переопределенными). Кроме того, в производном функция может использовать функцию базового класса с тем же именем. В этих случаях для различения функций следует использовать оператор принадлежности.
Заметим, что при построении иерархии классов полезно попытаться ответить на вопрос: «Что из себя представляет объект?». Например, «Что такое окружность? Окружность – геометрическое место точек, равноудаленных от центра. Что такое многоугольник? Многоугольник – фигура, состоящая из ломаных линий. Что такое линия? Линия-совокупность точек». Исходя из этого целесообразно для классов «Окружность» и «Многоугольник » в качестве базового выбрать класс «Точка».
Формат определения производного класса следующий:
тип_класса имя_класса : [модификатор_доступа]список_базовых_классов{ ...};
13.2. ДОСТУП К НАСЛЕДУЕМЫМ КОМПОНЕНТАМ
Если доступ к собственным компонентам производных классов определяется обычным образом, то на доступ к наследуемым компонентам влияет, во-первых, атрибут доступа, определенный в базовом классе, и во-вторых, модификатор доступа, указанный перед именем базового класса в конструкции определения производного класса. Этими модификаторами являются public и private. Варианты наследования прав доступа приведены в табл. 4.
© 1998 Калачев Д.П., Лутай В.Н.