Объект str3 = Пирамида
Определение первичного класса
Пример. Определим класс, объектом которого является стек целых чисел. Для инициализации стека определим дружественную функцию. Для записи элемента в стек и для чтения элемента из стека определим функции Push() и Pop().
#include <iostream.h>
#include <conio.h>
// Описание класса - целочисленный стек
class IntStack
{
// Закрытые элементы
int *v; // У нас стек будет реализован в виде массива
int size, top; // Размер стека и положение вершины
public: // Общедоступные элементы
friend IntStack init(int size); //Дружественная функция //инициализации стека
int pop(); // Извлечение числа из вершины стека
void push(int x); // Занесение числа в стек
};
// Инициализации стека
IntStack init(int size)
{
IntStack res; // Создаём новый стек
res.v=new int [size]; // Выделяем память под массив
res.size=size; // Указываем размер стека
res.top=size; // Устанавливаем вершину стека
return res; // Возвращаем созданный стек
}
// Занесение числа в стек
inline void IntStack::push(int x)
{
if(top>0) v[--top]=x;
}
// Извлечение числа из стека
inline int IntStack::pop()
{
if(top<size) return v[top++];
else return 0;
}
void main()
{
clrscr(); // Очистка экрана
IntStack s1, s2; // Создание стеков
s1=init(10); s2=init(20); // Инициализация стеков
cout<<"Заносим в стек s1 число -3\n";
s1.push(-3);
cout<<"Заносим в стек s2 число 1\n";
s2.push(1);
cout<<"Заносим в стек s1 число -2\n\n";
s1.push(-2);
cout<<"Извлекаем из стека s1 первое число "<<s1.pop();
cout<<", затем второе "<<s1.pop()<<'\n';
cout<<"Извлекаем из стека s2 число "<<s2.pop()<<'\n';
getch(); // Ожидание нажатия клавиши
}
Результаты работы программы
Заносим в стек s1 число -3
Заносим в стек s2 число 1
Заносим в стек s1 число -2
Извлекаем из стека s1 первое число -2, затем второе -3
Извлекаем из стека s2 число 1
Перегрузка операций
Например, для класса строки операцию сравнения относительно лексикографического (алфавитного) порядка можно определить с помощью приведённой ниже составной функции:
#include <string.h>
class String
{
char *s;
int len;
public:
int operator<(String st)
{
return strcmp(s,st,s)<0;
}
};
То же самое с помощью дружественной функции определяется следующим образом
#include <string.h>
class String
{
char *s;
int len;
public:
friend int operator<(String, String);
};
operator<(String str1, String str2)
{
return strcmp(str1.s, str2.s)<0;
}
Пример. Пусть класс определен как строка символов. Определим операцию индексации, позволяющую читать и записывать i -й символ строки:
#include <string.h>
#include <conio.h>
#include <iostream.h>
// Класс строка
class String
{
// Закрытые элементы
char *s; // Сама строка
int len; // Её длина
public: // Общедоступные элементы
// Перегрузка операции []
char& operator[](int pos)
{
return s[pos];
}
// Инициализация строки
void init(char *s)
{
len=strlen(s); // Определение длины
String::s=new char[len+1]; // Выделение памяти под строку
strcpy(String::s, s); // Присваивание
}
// Вывод строки на экран
void show()
{
cout<<s<<'\n';
}
};
void main()
{
clrscr(); // Очистка экрана
String a; // Создаём строку
a.init("abc"); // Инициализируем её
cout<<"Начальное содержимое строки: ";
a.show(); // Выводим строку на экран
a[1]='c';
cout<<"Содержимое строки после операции a[1]=\'c\': ";
a.show(); // Выводим строку на экран
a[0]='b';
cout<<"Содержимое строки после операции a[0]=\'b\': ";
a.show(); // Выводим строку на экран
cout<<"Содержимое строки после операции a[0]=a[2]: ";
a[0]=a[2];
a.show(); // Выводим строку на экран
getch(); // Ожидание нажатия клавиши
}
Результаты работы программы
Начальное содержимое строки: abc
Содержимое строки после операции a[1]='c': acc
Содержимое строки после операции a[0]='b': bcc
Содержимое строки после операции a[0]=a[2]: ccc
Конструкторы
Пример. Определим класс двумерного вектора. Будем инициализировать его с помощью полярных координат:
#include <iostream.h>
#include <math.h>
#include <conio.h>
class Vector
{
double x, y;
public:
Vector(double rho, double phi);
void show()
{
cout << "Вектор = ("<< x << ", " << y << ")\n";
}
};
Vector::Vector(double rho, double phi = 0)
{
x = rho*cos(phi);
y = rho*sin(phi);
}
void main()
{
clrscr();
Vector v(1), w(-1, 0.5);
v.show(); w.show();
getch();
}