Перегрузка операций

Результаты работы программы

Результаты работы программы

Объект 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(); // Ожидание нажатия клавиши

}


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: