Результаты работы программы
Входные данные:
Первая строка abc
Длина первой строки 3
Вторая строка 1234
Длина второй строки 4
Выходные данные:
Результат конкатенации первой и второй строк abc1234
Длина результирующей строки 7
Те же самые результаты могут быть получены при запуске следующей программы, отличающейся от приведённой выше способом копирования входных строк в результирующую:
#include <stdio.h> //библиотека стандартного ввода-вывода
#include <string.h> //библиотека функций для работы со строками
#include <conio.h> //библиотека консольного ввода-вывода
struct string { //структура string
int length; //содержит длину
char *p; //и саму строку
};
string operator+(string s, string t) //перегрузка операции +
{
int i;
string res; //результирующая строка
res.p=new char[s.length+t.length+1];//выделим память для строки
for (i=0; i<s.length; i++)
res.p[i]=s.p[i]; //копируем первую строку
for (i=s.length; i<s.length+t.length; i++)
res.p[i]=t.p[i-s.length]; //копируем вторую строку
res.p[i]=0; //строка завершается 0
res.length=s.length+t.length; //заполняем поле структуры- //длина строки
return res;
}
void main()
{
string s1={3,"abc"}, s2={4,"1234"},s3; //строки s1,s2,s3
clrscr();
printf("Входные данные:",s3.p);
printf("\nПервая строка %s\n",s1.p);
printf("Длина первой строки %d\n",s1.length);
printf("Вторая строка %s\n",s2.p);
printf("Длина второй строки %d\n",s2.length);
s3=s1+s2; //используем перегруженную операцию +
printf("\nВыходные данные:\n");
printf("Результат конкатенации первой и второй строк %s\n",s3.p);
printf("Длина результирующей строки %d\n",s3.length);
//результат конкатенации s1
//s2 - "abc1234" длина - 7
}
Пример. Рассмотрим структуру, реализующую двумерный вектор. Определим для него операции суммы, разности, унарного минуса, скалярного произведения.
#include <stdio.h> //библиотека стандартного ввода-вывода
struct Vector { //структура вектора на плоскости
double x,y; //состоит из координат х и у
};
Vector operator+(Vector v, Vector w) //перегрузим операцию сложения
{
Vector t;
t.x=v.x+w.x; t.y=v.y+w.y; //складываются соответствующие координаты
//двух векторов
return t;
}
Vector operator-(Vector v, Vector w) //перегрузим операцию вычитания
{
Vector t;
t.x=v.x-w.x; t.y=v.y-w.y; //находится разность соответствующих
//координат двух векторов
return t;
}
Vector operator-(Vector v) //перегрузим операцию унарного минуса
{
Vector t;
t.x=-v.x; t.y=-v.y; //найдём вектор,противоположно направленный
//и имеющий ту же длину, для данного
return t;
}
double operator*(Vector v, Vector w) //перегрузим операцию умножения
{
return v.x*w.x+v.y*w.y;//найдём скалярное произведение двух векторов
}
int main()
{
Vector a={1,0}, b={-1,1},c,d,e;
printf ("\nВходные данные:\n");
printf ("Вектор а={%f,%f},b={%f,%f}\n",a.x,a.y,b.x,b.y);
c=a-b;
printf("\nРезультат вычитания a-b={%f,%f}",c.x,c.y); //вычитание
printf("\nРезультат скалярного произведения a*b=%f",a*b);
//произведение
d=a+b;
printf("\nРезультат сложения a+b={%f,%f}",d.x,d.y); //сложение
e=-a;
printf("\nВектор противоположный а это вектор е={%f,%f}",e.x,e.y);
//унарный минус
}
Результаты работы программы
Входные данные:
Вектор а={1.000000,0.000000},b={-1.000000,1.000000}
Выходные данные:
Результат вычитания a-b={2.000000,-1.000000}
Результат скалярного произведения a*b=-1.000000
Результат сложения a+b={0.000000,1.000000}
Вектор противоположный а это вектор е={-1.000000,-0.000000}
ОБЪЕКТЫИ КЛАССЫ
Класс как обобщение структуры
Пример 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(); // Ожидание нажатия клавиши
}