27
-
Статический метод – это по сути глобальная функция, область видимости которой ограничена именем класса, поэтому (если она public) фактически вызвать ее можно, указывая имя класса и спецификатор области видимости, но формально она является членом класса, поэтому вызывать ее можно также посредством объекта или указателя на объект.
-
Основные отличия статического метода класса от обычного:
-
указатель this в статических методах не существует;
-
Чтобы обратиться к нестатическим полям класса в статическом методе нужно им передать объект как параметр;
28
-
Указатель на функцию
-
Объявление указателя на функцию:
-
тип (*имя_указателя)(типы параметров функции)
-
Указатель на функцию как параметр функции. Функция qsort
-
Прототип функции qsort (stdlib.h (С), cstdlib (С++):
-
void qsort(void* first, size_t num, size_t size,
-
int (* comp) (const void*, const void*));
-
Параметры:
-
first - указатель на первый элемент сортируемого массива;
-
num - количество элементов в сортируемом массиве, на который ссылается указатель first;
-
size - размер одного элемента массива в байтах;
-
comp – указатель на функцию, которая сравнивает два элемента массива. Функция должна иметь следующий прототип:
-
int compare(const void* v1, const void* v2)
29
-
В определении указателя на функцию количество и тип параметров должны совпадать с соответствующими типами в определении функции, на которую ставится указатель.
-
Присвоение указателю на функцию адреса функции не требует операции взятие адреса (&), поскольку имя функции само по себе обозначает этот адрес.
-
Функция qsort выполняет сортировку num элементов массива, на который ссылается указатель first. Для каждого элемента массива устанавливается размер в байтах, который передается через параметр size. Последний параметр функции qsort— указатель comp на функцию сравнения, которая используется для определения порядка следования элементов в отсортированном массиве.
-
Функция сравнения (compare) имеет два параметра - не типизированные указатели (void* v1, void* v2) на элементы массива. Эти параметры должны быть приведены к указателям на те типы данных, которые имеют элементы массива. Возвращаемое значение этой функции должно быть отрицательным, положительным или равным нулю. Если необходимо выполнить сортировку элементов массива по возрастанию, то если *v1 < *v2, тот функция должна вернуть отрицательное значение, если *v1 > *v2, тот функция должна вернуть положительное значение, если *v1 == *v2, тот функция должна вернуть ноль.
30
Пример 11. Использование функции qsort
#include <iostream>
#include <cstdlib>
using namespace std;
int vector[] = { 14, 10, 11, 19, 2, 25 };
int compare(const void * x1, const void * x2)
{if (*(int*)x1 < *(int*)x2) return -1;
else if (*(int*)x1 > *(int*)x2) return 1;
else return 0;
}
int main ()
{ qsort(vector, 6, sizeof(int), compare);
for ( int i = 0; i < 6; i++)
cout << vector[i] << " ";
return 0;
}
31
-
Контрольные вопросы
-
Понятие класса в С++. Синтаксис описания класса в С++. Понятие интерфейса и реализации класса. Примеры.
-
Понятие, назначение и основные свойства конструкторов и деструкторов. Виды конструкторов, примеры их использования.
-
Понятие объекта в С++. Варианты создания объекта в С++: синтаксис и примеры. Как организуется доступ к полям и методам объекта, объявленным в секциях private и public?
-
Способы создания массива объектов, примеры. Сортировка объектов с использованием функции qsort().
-
Статические поля и методы класса: назначение, синтаксис описания и примеры использования
32