- •Операторы динамического распределения памяти
- •Перегрузка функций и операций
- •Объекты и классы Класс как обобщение структуры
- •Определение первичного класса
- •Перегрузка операций
- •Конструкторы
- •Список инициализации
- •Деструктор
- •Дружественные классы
- •Статические элементы класса
- •Шаблоны функций
- •Контейнерные классы Шаблоны классов
- •Параметризованные очереди и стеки
- •Бинарные деревья
- •Определение класса множества
- •Производные классы Доступ к полям и функциям базового класса
- •Класс дерева поиска
- •Параметризованный связный список
- •Множественное наследование
- •Виртуальные классы
- •Виртуальные функции Переопределение составной функции
- •Организация списка объектов различного типа
- •Виртуальные деструкторы
- •Абстрактные классы
Объекты и классы Класс как обобщение структуры
Пример 1. Будем использовать ключевое слово struct для определения класса двумерного вектора, для которого определены функции ввода и вывода данных, составляющих объект.
#include <iostream.h>
#include <conio.h>
// Класс вектор
struct Vector
{
double x, y; // Координаты вектора
// Функция вывода на экран координат вектора
void get()
{
cout<<"x="<<x<<' '<<"y="<<y<<'\n';
}
// Функция ввода с клавиатуры координат вектора
void put()
{
cout<<"Введите через пробел координаты вектора (x и y): ";
cin>>x>>y;
}
};
void main()
{
clrscr(); // Очистка экрана
Vector v, w[2]; // Определение векторов
v.put(); w[0].put(); w[1].put(); // Ввод координат векторов
// Вывод координат векторов
cout<<"\nКоординаты вектора v: ";
v.get();
cout<<"Координаты вектора w[0]: ";
w[0].get();
cout<<"Координаты вектора w[1]: ";
w[1].get();
getch(); // Ожидание нажатия клавиши
}
Результаты работы программы
Введите через пробел координаты вектора (x и y): 12.4 3.56
Введите через пробел координаты вектора (x и y): 2.34 5.6
Введите через пробел координаты вектора (x и y): 7 8.02
Координаты вектора v: x=12.4 y=3.56
Координаты вектора w[0]: x=2.34 y=5.6
Координаты вектора w[1]: x=7 y=8.02
Пример 2. Рассмотрим подпрограмму перегрузки операции присваивания для структуры, состоящей из строки и ее длины. В теле класса эта функция объявлена как
str& operator = (const str&);
она будет возвращать адрес объекта, полученного после присваивания. Это позволит применять цепочки присваиваний, например, str1 = str2 = str3. Аргумент функции сделаем ссылочным, чтобы избежать копирования всего объекта в стек при вызове операции присваивания. В стек теперь будет сохраняться адрес объекта.
#include <string.h>
#include <iostream.h>
#include <conio.h>
// Класс строка
struct Str
{
char *s; // Указатель на строку
int len; // Длина строки
void init(const char*); // Функция инициализации строки
Str operator = (const Str); // Перегрузка операции =
};
// Перегрузка операции =
Str Str::operator = (const Str st)
{
len = st.len; // Выяснение длины новой строки
delete s; // Удаление старого содержимого
s = new char[len + 1]; // Выделение памяти под новую строку strcpy(s, st.s); // Копирование строки
return *this; // Возвращение полученной строки по значению
}
// Функция инициализации строки
void Str::init(const char* s)
{
len = strlen(s); // Выяснение длины строки
Str::s = new char[len + 1]; // Выделение памяти под строку strcpy(Str::s, s); // Копирование строки
}
void main()
{
clrscr(); // Очистка экрана
Str str1, str2, str3; // Создание строк
str1.init("Пирамида"); // Инициализация первой строки
str3 = str2 = str1; // Присваивание значения первой строки
// остальным двух строкам
cout<<"Объект str3 = " << str3.s << '\n'; // Вывод третьей строки
getch(); // Ожидание нажатия клавиши
}
Результаты работы программы
Объект str3 = Пирамида
