
- •1) Системы счисления. Перевод чисел из одной системы счисления в другую
- •4) Арифметические выражения. Приемы, используемые для минимизации вычислений: вынесение общих множителей за скобки, использование дополнительных переменных
- •5) Ввод чисел с клавиатуры и вывод чисел в окно программы, формат ввода и вывода.
- •6) Средства разработки программ разветвляющейся структуры. Условные и безусловные операторы перехода.
- •8) Рекурсия. Использование рекурсии для вычисления числа Фибоначчи.
- •9) Уточнение корней уравнений: метод простых итераций, метод половинного деления, метод касательных.
- •10)Организация программ со структурой вложенных циклов. Транспонирование матриц
- •11)Массивы. Сохранение результатов вычислений в массиве.
- •12)Метод сортировки массива вставками.
- •13) Метод прямого обмена (метод пузырька) и его модификация.
- •14) Метод прямого выбора и его модификации: сортировка методом поиска минимального/максимального элемента, сортировка методом поиска индекса
- •15) Указатели
- •16) Матрицы. Обработка матриц. Многомерные статические массивы.
- •17) Массивы указателей. Динамические массивы. Операции new, new [], delete, delete [], malloc, free.
- •18) Программирование с использованием подпрограмм. Объявление функций. Глобальные переменные. Передача параметров. Передача массивов в качестве параметров.
- •19) Рекурсивные функции.
- •20) Перегружаемые функции, параметры со значениями по умолчанию, функции с переменным числом параметров.
- •21) Указатели на функции, передача указателей на функции в качестве параметров.
- •22) Классы. Конструктор и деструктор. Квалификаторы прав доступа. Указатель this.
- •23) Перегрузка стандартных операций. Наследование классов.
- •24) Открытое наследование, полиморфизм классов. Виртуальные функции и абстрактные классы.
- •25) Шаблоны функций и классов.
- •26)Наследование классов. Множественное наследование. Виртуальные классы.
- •Приложение. Полный код программы по транспонированию матрицы.
21) Указатели на функции, передача указателей на функции в качестве параметров.
Указатель на функцию— это довольное сложное, но очень мощное средство C++. Несмотря на то что функция не является переменной, она, тем не менее, занимает физическую область памяти, некоторый адрес которой можно присвоить указателю. Адрес, присваиваемый указателю, является входной точкой функции. (Именно этот адрес используется при вызове функции.) Если некоторый указатель ссылается на функцию, то ее (функцию) можно вызвать с помощью этого указателя.
Указатели на функции также позволяют передавать функции в качестве аргументов другим функциям. Адрес функции можно получить, используя имя функции без круглых скобок и аргументов. (Этот процесс подобен получению адреса массива, когда также используется только его имя без индекса.) Если присвоить адрес функции указателю, то эту функцию можно вызвать через указатель.
Указатель на функцию позволяет передавать ее адрес другой функции. В качестве показательного примера можно привести функцию qsort() из стандартной С++-библиотеки. Функция qsort() — это функция быстрой сортировки, основанная на алгоритме Quicksort, который упорядочивает содержимое массива. Вот как выглядит ее прототип.
void qsort(void * start, size_t length, size_t size, int (*compare) (const void *, const void *));
Функция qsort() — это функция сортировки из стандартной С++-библиотеки.
Прототип функции qsort() "прописан" в заголовке <cstdlib>, в котором также определен тип size_t (как тип unsigned int). Чтобы использовать функцию qsort(), необходимо передать ей указатель на начало массива объектов, который вы хотите отсортировать (параметр start), длину этого массива (параметр length), размер в байтах каждого элемента (параметр size) и указатель на функцию сравнения элементов массива (параметр *compare).
Функция сравнения, используемая функцией qsort(), сопоставляя два элемента массива, должна возвратить отрицательное значение, если ее первый аргумент указывает на значение, которое меньше второго, нуль, если эти аргументы равны, и положительное значение, если первый аргумент указывает на значение, которое больше второго.
Полный код программы в приложении.
22) Классы. Конструктор и деструктор. Квалификаторы прав доступа. Указатель this.
Начнем с определения терминов класса и объекта. Класс определяет новый тип данных, который задает формат объекта. Класс включает как данные, так и код, предназначенный для выполнения над этими данными. Следовательно, класс связывает данные с кодом. В C++ спецификация класса используется для построения объектов. Объекты — это экземпляры класса. По сути, класс представляет собой набор планов, которые определяют, как строить объект. Важно понимать, что класс — это логическая абстракция, которая реально не существует до тех пор, пока не будет создан объект этого класса, т.е. то, что станет физическим представлением этого класса в памяти компьютера.
Определяя класс, вы объявляете данные, которые он содержит, и код, который выполняется над этими данными. Хотя очень простые классы могут содержать только код или только данные, большинство реальных классов содержат оба компонента. В классе данные объявляются в виде переменных, а код оформляется в виде функций. Функции и переменные, составляющие класс, называются его членами. Таким образом, переменная, объявленная в классе, называется членом данных, а функция, объявленная в классе, называется функцией-членом. Иногда вместо термина член данных используется термин переменная экземпляра (или переменная реализации).
Любой класс может содержать как закрытые, так и открытые члены. По умолчанию все элементы, определенные в классе, являются закрытыми(private). Это означает, что к ним могут получить доступ только другие члены класса; никакие другие части программы этого сделать не могут. В этом состоит одно из проявлений инкапсуляции: программист в полной мере может управлять доступом к определенным элементам данных. Закрытыми можно объявить и функции, и тогда их смогут вызывать только другие члены этого класса.
Чтобы сделать части класса открытыми (т.е. доступными для других частей программы), необходимо объявить их после ключевого слова public. Все переменные или функции, определенные после спецификатора public, доступны для всех других функций программы.
Если член класса объявлен с использованием спецификатора protected, он не будет доступен для других элементов программы, которые не являются членами данного класса. С одним важным исключением доступ к защищенному члену идентичен доступу к закрытому члену, т.е. к нему могут обращаться только другие члены того же класса. Единственное исключение из этого правила проявляется при наследовании защищенного члена. В этом случае защищенный член существенно отличается от закрытого.
Закрытый член базового класса не доступен никаким другим частям программы, включая и производные классы. Однако с защищенными членами все обстоит иначе. Используя спецификатор protected, можно создать члены класса, которые закрыты в рамках своего класса, но которые может унаследовать производный класс, причем с получением доступа к ним.
void queue::qput(int i)
Оператор "::" называется оператором разрешения области видимости. По сути, он сообщает компилятору, что данная версия функции qput() принадлежит классу queue. Другими словами, оператор "::" заявляет о том, что функция qput() находится в области видимости класса queue. Различные классы могут использовать одинаковые имена функций. Компилятор же определит, к какому классу принадлежит функция, с помощью оператора разрешения области видимости и имени класса.
Если одна функция-член вызывает другую функцию-член того же класса, не нужно указывать имя объекта и использовать оператор "точка". В этом случае компилятор уже точно знает, какой объект подвергается обработке. Имя объекта и оператор "точка" необходимы только тогда, когда функция-член вызывается кодом, расположенным вне класса. По тем же причинам функция-член может непосредственно обращаться к любому члену данных своего класса, но код, расположенный вне класса, должен обращаться к переменной класса, используя имя объекта и оператор "точка".
Как правило, некоторую часть объекта, прежде чем его можно будет использовать, необходимо инициализировать. Поскольку требование инициализации членов класса весьма рспространено, в С++ предусмотрена реализация этой возможности при создании объекта.
Тут нам как раз сможет помочь конструктор класса. Кстати, конструктор (от слова construct — создавать) – это специальный метод класса, который предназначен для инициализации элементов класса некоторыми начальными значениями.
В отличии от конструктора, деструктор (от слова destruct — разрушать) — специальный метод класса, который служит для уничтожения элементов класса. Чаще всего его используют тогда, когда в конструкторе,при создании объекта класса, динамически был выделен участок памяти и необходимо эту память очистить, если эти значения уже не нужны для дальнейшей работы программы.
Важно запомнить:
конструктор и деструктор, мы всегда объявляем в разделе public;
при объявлении конструктора, тип данных возвращаемого значения не указывается, в том числе — void!!!;
у деструктора также нет типа данных для возвращаемого значения, к тому же деструктору нельзя передавать никаких параметров;
имя класса и конструктора должно быть идентично;
имя деструктора идентично имени конструктора, но с приставкой ~ ;
В классе допустимо создавать несколько конструкторов, если это необходимо. Имена, согласно пункту 2 нашего списка, будут одинаковыми. Компилятор будет их различать по передаваемым параметрам (как при перегрузке функций). Если мы не передаем в конструктор параметры, он считается конструктором по умолчанию;
Обратите внимание на то, что в классе может быть объявлен только один деструктор;
Ключевое слово this — это указатель на объект, который вызывает функцию-член.
При каждом вызове функции-члена ей автоматически передается указатель, именуемый ключевым словом this, на объект, для которого вызывается эта функция. Указатель this — это неявный параметр, принимаемый всеми функциями-членами. Следовательно, в любой функции-члене указатель this можно использовать для ссылки на вызывающий объект.
Как вы знаете, функция-член может иметь прямой доступ к закрытым (private) членам данных своего класса.
Например, у нас определен такой класс.
class cl {
int i;
void f() { ... };
// . . .
};
В функции f() можно использовать следующую инструкцию для присваивания члену i значения 10.
i = 10;
В действительности предыдущая инструкция представляет собой сокращенную форму следующей.
this->i = 10;