Статические элементы класса
Пример. Определим класс строки, содержащий подпрограмму, возвращающую количество объектов этого класса, находящихся в области видимости. Определим статическую переменную many целого типа. Конструктор объекта будет увеличивать эту переменную на 1, а деструктор – уменьшать на 1. Распределение области памяти, занимаемой объектами класса, приведено на рис. 2.1.
Int many | - поле, содержащееся в каждом объекте | |||
Объект char *s int length | Объект char *s int length | · · · | Объект char *s int length | - поля объектов, содержащие указатели на строки и длины строк |
Приведём текст программы:
#include <iostream.h>
#include <conio.h>
#include <string.h>
class Vstring
{
// Закрытые элементы
static int many; // Количество объектов Vstring
char *s; // Строка
int length; // Длина строки
public: // Общедоступные элементы
Vstring(char *text) // Конструктор
{
length = strlen(text); // Вычисление длины
s = new char[length+1]; // Выделение памяти
strcpy(s, text); // Копирование строки
many++; // Увеличение числа объектов
}
~Vstring() // Деструктор
{
delete s; // Освобождение памяти
many--; // Уменьшение числа объектов
}
static int Number() { return many; } // Статическая функция
// Общая функция
void get()
{
cout << s << '\n';
}
};
int Vstring::many = 0; // Установка начального числа объектов
void main()
{
clrscr(); // Очистка экрана
cout << "Количество объектов Vstring: " << Vstring::Number() << '\n';
Vstring u("12345");
cout << "Количество объектов Vstring: " << Vstring::Number() << '\n';
Vstring v("12345");
cout << "Количество объектов Vstring: " << Vstring::Number() << '\n';
cout << "Значение объекта v: ";
v.get();
cout << '\n';
for(int i = 0; i < 3; i++)
{
cout<<"Количество объектов Vstring: "<<Vstring::Number()<<'\n';
Vstring v("12345");
cout<<"Количество объектов Vstring: "<<Vstring::Number()<<'\n';
getch();
}
}
Результаты работы программы
Количество объектов Vstring: 0
Количество объектов Vstring: 1
Количество объектов Vstring: 2
Значение объекта v: 12345
Количество объектов Vstring: 2
Количество объектов Vstring: 3
Количество объектов Vstring: 2
Количество объектов Vstring: 3
Количество объектов Vstring: 2
Количество объектов Vstring: 3
Шаблоны функций
Например, максимум двух значений типа Т можно вычислять с помощью функции:
template <class T> // Ключевое слово и параметр
const T& Max(const T& a, const T& b)
{
return a>b? a:b;
}
void main()
{
int i = 1, j = 2;
float r = 1.1, s = 1.2;
int k = Max(i, j);
float t = Max(r, s);
}
Пример. Параметризованная функция бинарного поиска в отсортированном массиве.
#include <iostream.h>
#include <conio.h>
template <class Type>
int binsearch(Type* x, int count, Type key)
{
int low, high, mid; // Левый, правый и средний элементы
low = 0; high = count - 1;
while (low <= high)
{
mid = (low+high)/2; // Вычисление середины массива
if(key < x[mid]) high = mid - 1; // Если нужный элемент
// находится слева от середины
else if(key > x[mid]) low = mid + 1; // Если справа
else return mid; // Нашли
}
return -1; // Не нашли
}
void main()
{
clrscr(); // Очистка экрана
int nums[] = {1, 2, 3, 5, 7, 11, 13, 17}; // Массив, в котором ищем
cout << "5 находится на " << binsearch(nums, 8, 5)
cout << " месте в массиве.";
getch(); // Ожидание нажатия клавиши
}