- •Лекция 1 Создание консольного приложения
- •2. Консоль. Построение консольного проекта
- •3. Запуск приложения
- •4. Сохранение и редактирование проекта
- •Лекция 2
- •4. Функции форматированного ввода и вывода
- •4.1. Функция форматированного ввода с клавиатуры
- •4.2. Функция форматированного вывода на экран
- •5. Математические функции
- •Лекция 3 Линейные вычислительные процессы
- •1. Алгоритм. Управляющие структуры
- •2. Линейные вычислительные алгоритмы
- •2.1. Условный оператор if()
- •2.2. Условное выражение
- •2.3. Оператор выбора switch()
- •Лекция 5 Программирование разветвляющихся вычислительных процессов
- •Лекция 6 Циклические вычислительные процессы.
- •1. Типы циклов
- •3. Операторы безусловного перехода
- •Лекция 7 Вычисление последовательностей
- •4. Примеры вычисления последовательностей
- •5. Структура алгоритмов вычисления рекуррентных последовательностей
- •Лекция 8 Одномерные массивы
- •1. Массивы
- •1.1. Примеры программ обработки одномерных массивов
- •1.2. Сортировка выбором
- •1.3. Сортировка простыми вставками
- •Лекция 10 Двухмерные массивы
- •1. Двухмерные массивы
- •Лекция 11 Алгоритмы матричной алгебры
- •1. Алгоритмы матричной алгебры
- •Лекция 12 Динамические массивы
- •1. Память компьютера. Адресное пространство
- •2. Динамическая память
- •3. Адреса и указатели
- •4. Указатели и массивы. Динамические массивы
- •5. Проблемы, связанные с указателями
- •6. Поразрядные операции
- •1.2. Способы объявления и обращения к элементам двухмерных массивов
- •Лекция 14 Символы и строки
- •1. Символьный тип данных
- •2. Строки
- •Лекция 15 Структуры
- •1. Понятие структуры
- •2. Определение нового имени типа
- •3. Массивы структур. Указатели на структуры
- •3.1. Определение статического массива структур
- •3.1. Определение динамического массива из n структур
- •Лекция 16 Файлы
- •1. Потоковый ввод-вывод данных
- •3. Понятие файла. Функции работы с файлами
- •Лекция 17 Файлы
- •Лекция 18 Функции пользователя
- •I. Приёмы построения алгоритмов
- •2. Понятие функции
- •2.1. Определение функции
- •2.2. Область видимости переменных
- •2.3. Параметры функции
- •2.4. Описание функции
- •2.5. Организация вызова функции
- •2.5. Передача параметров в функцию
- •3. Рекурсия
- •Лекция 20 Нахождение приближенного значения корня нелинейного уравнения
- •На отрезке [a;b] с заданной точностью eps
- •1.1. Метод дихотомии (половинного деления)
- •1.2. Метод хорд
- •1.3. Метод касательных (Ньютона)
- •Лекция 22 Объектно-ориентированное программирование
- •Полиморфизм – это свойство класса, позволяющее определить одно и то же по имени, но разное по смыслу действие. Основные этапы ооп:
- •Уточнённое имя принадлежит классу (т.Е. Компонентной) функции
- •Лекция 23 Объектно-ориентированное программирование
- •1. Конструкторы и деструкторы
- •1.2. Определение компонентных функций
- •Лекция 25 Объектно-ориентированное программирование
- •1. Свойства классов
- •1.1. Наследование классов
- •1.2. Полиморфизм
- •Библиографический список
1.2. Определение компонентных функций
Компонентная функция должна быть обязательно описана в теле класса. В отличие от обычных (глобальных) функций компонентная функция имеет доступ ко всем компонентам класса (с любым статусом доступа). Функция–компонент класса имеет ту же область видимости, что и класс, к которому она относится. Программист может влиять на компилятор, предлагая ему оформить ту или иную функцию как представляемую (встраиваемую). Для этих целей в определении функции указывается служебное слово (спецификатор) inline. При определении классов их компонентные функции также могут быть специфицированы как подставляемые. Кроме явного использования служебного слова inline для этого используется следующее соглашение. Если определение (не только прототип) принадлежит классу функции полностью размещено в классе (в теле класса), то эта функция по умолчанию считается подставляемой. Именно таким образом определены компонентные функции классов complex1, complex, stroka, использованных ранее в качестве примеров. Все функции перечисленных классов воспринимаются компьютером как подставляемые, то есть при каждом вызове этих функций их код «встраивается» непосредственно в точку вызова.
Но подставляемыми функциями могут быть не всякие функции. Подставляемая функция не может быть рекурсивной, не может содержать циклы, переключатели и т.д. Это ограничение весьма существенное, поэтому существует второй способ определения принадлежащих классу функций. Он состоит в том, что внутри тела класса помещается только прототип компонентной функции, а её определение – вне класса, как определение любой другой функции, входящей в программу. При таком внешнем определении компонентной функции она также может быть снабжена спецификатором inline, но при этом опять возникнут указанные ограничения, накладываемые на подставляемые функции.
При внешнем определении компонентной функции программист «должен сообщить» компилятору, к какому именно классу она относится. Для этого используется бинарная форма операции ‘::’ (указания области видимости).
Формат её использования в этом случае таков:
<имя класса> : : <имя компонентной функции>
Приведённая конструкция, называемая квалифицированным именем компонентной функции, означает, что функция есть компонент класса и лежит в области его действия. Именно такое определение привязывает функцию к классу и позволяет в её теле непосредственно использовать любые данные класса (его объектов) и любые принадлежащие классу функции (это относится и к собственным private- и к защищённым protected- компонентам).
При внешнем определении компонентной функции в теле класса помещается её прототип:
<тип> <имя функции> (<спецификация и инициализация параметров>);
Вне тела класса компонентная функция определяется таким образом:
<тип> <имя функции> (<спецификация формальных параметров>)
{
<тело, принадлежащее классу функции>
}
В качестве примера программу с использованием класса «вектор в двумерном пространстве».
Компонентные данные (свойства) класса: координаты вектора.
Компонентные функции (методы) класса:
1) ввод координат;
2) вывод координат;
3) определение длины вектора.
// VECT.H
class vect_2D
{
private:
float x, y;
public:
void get_x (float x1);
void get_y (float y1);
void print ();
float len ();
};
// Описание методов класса
void vect_2D : : get_x (float x1)
{ x=x1;} // Где x – компонент класса, x1 – передаваемое в get_x значение
void vect_2D : : get_y (float y1)
{ y=y1;}
void vect_2D : : print ()
{ printf (“{%f; %f}\n”, x, y); }
float vect_2D : : len ()
{
float z;
z=sqrt(x*x + y*Y);
return z;
}
Добавим этот объект класса в код программы, подключив проект «vect.h» в головном файле
#include “stdio.h”
#include “math.h”
#include “vect.h”
int main ( )
{
vect_2D v1, *v2;
float x, y, z;
v2=(vect_2D*) malloc (sizeof(vect_2D));
printf (“x=”); scanf (“%f”,&x);
printf (“y=”); scanf (“%f”,&y);
v1. get_x(x);
v1. get_y(y);
v2 – > get_x(x);
v2 – > get_y(y);
z=v1. print ( );
free (v2);
return 1;
}