- •1. Объектно-ориентированное программирование как методология проектирования программных средств.
- •1.2. Объект
- •Iarray a(10), b(25), c(45);
- •Int main(void)
- •2.1. Перегрузка имен функций
- •Int print(int);
- •Void print(int);
- •Int (*matrix)[10];
- •Void main(void)
- •Void incr(int &aa)
- •3.2 Объявление класса.
- •Имя_класса имя объекта;
- •Имя объекта. Имя элемента
- •Имя_объекта. Имя_метода( );
- •Имя класса *this;
- •Имя_класса (список формальных параметров)
- •Листинг 3.4
- •V_3d( double &X, double &y,double &z)
- •Void main(void)
- •Х:: х(const х&)
- •V_3d::v_3d(const v_3d& v1)
- •Void v_3d::print()
- •Сlass X
- •Void main (void)
- •4. Перегрузка операций
- •V_3d(double x1,double y1,double z1)
- •Void print();
- •Void main(void)
- •Void v_3d::print()
- •4.3.1. Использование дружественных функций при перегрузке операций
- •Void print();
- •Void main(void)
- •Void v_3d::print()
- •4.3.2.Особенности использования дружественных функций
- •Имя объекта. Имя_функции
- •Void f1( X& );
- •Void f2 ( X* );
- •Void main(void)
- •5. Производные классы
- •Int Bfunc( );
- •Int Xfunc( );
- •Int Efunc( X & x1 );
- •Istream
- •Iostream
- •Ifstream
- •С помощью манипуляторов – специальных операций, вставляемых непосредственно в поток вывода.
- •Int width( int w);
- •Int precision( int p);
- •Void main(void)
- •Void open(char* filename, int mode, int access);
- •If(!fout) {
- •7. Виртуальные функции
- •Circle a;
- •A.Build();
- •Virtual double a(double X)
- •Void main (void)
- •Void Graphics Object :: Build() { };
- •8.Шаблоны функций и классов
- •Void main(void)
- •Void Swap ( SwapType &X, SwapType &y)
- •Void main(void)
- •Int a, double b;
- •Int sloc,rloc;//начало и конец очереди
- •Void qput(t I); // помещение элемента в очередь
- •Int main(void)
- •1.Какой принцип ооп реализуется с помощью шаблонных функций и классов?
- •2.Когда целесообразно использовать шаблоны функций? Каков общий вид объявления шаблона функции?
4.3.1. Использование дружественных функций при перегрузке операций
Поскольку функции-друзья не являются элементами классов, они не могут иметь неявный аргумент this. Поэтому при использовании дружественной функции-оператора оба операнда передаются функции при перегрузке бинарных операций, а при перегрузке унарных операций передается один операнд. В качестве примера в листинге 4.2 приведена модифицированная версия программы из листинга 4.1, в которой операции + и ++ перегружены с помощью дружественных функций.
Листинг 4.2. Перегрузка операций с помощью дружественных функций.
#include <iostream.h>
#include <math.h>
class V_3d
{
int x,y,z;
public:
//конструктор по умолчанию
V_3d(){x=0;y=0;z=0;};
//конструктор, принимающий параметры
V_3d(int x1,int y1,int z1)
{
x=x1; y=y1; z=z1;
};
//вывод вектора
Void print();
// функция-друг для перегрузки +
friend V_3d operator +(V_3d op1, V_3d op2);
// функция-друг для перегрузки ++
friend V_3d operator ++(V_3d &op1);
// функция для перегрузки =
V_3d operator =( V_3d t);
};
Void main(void)
{
//создание объектов а, b, d, s класса V_3d
V_3d a(2,3,5);
V_3d b(5,6,5);
V_3d d,s;
cout << "координаты вектора a:\n";
a.print();
cout << "координаты вектора b:\n";
b.print();
d=a+b; //демонстрация перегруженной
// операции сложения векторов a и b
cout << "\n сумма векторов a и b :\n";
d.print();
s=a; // демонстрация перегруженной операции присваивания
cout << "\n координаты вектора s\n";
s.print();
++s;
cout << "\n координаты вектора s после увеличения на 1\n";
s.print();
}
//метод класса для вывода координат вектора
Void v_3d::print()
{
cout << "x= " << x << " y= " << y << " z= " << z <<"\n";
}
// определение дружественной функции - оператора +
V_3d operator +(V_3d op1,V_3d op2)
{
V_3d c;
c.x=op1.x+op2.x;
c.y=op1.y+op2.y;
c.z=op1.z+op2.z;
return c;
}
// определение дружественной функции - оператора ++
V_3d operator ++(V_3d &op1)
{
op1.x++;
op1.y++;
op1.z++;
return op1;
}
// определение функции - оператора=
V_3d V_3d::operator =(V_3d t)
{
x=t.x;
y=t.y;
z=t.z;
return *this;
}
Результаты работы этой программы:
координаты вектора a :
x= 2 y= 3 z= 5
координаты вектора b:
x= 5 y= 6 z= 5
сумма векторов a и b :
x= 7 y= 9 z= 10
координаты вектора s
x= 2 y= 3 z= 5
координаты вектора s после увеличения на 1
x= 3 y= 4 z= 6
Из этой программы видно, что дружественной функции operator + передаются оба операнда. Левый операнд передается в переменной op1, а правый – в переменной op2. Дружественной функции operator ++ передается один операнд – ссылка на объект, так как она должна модифицировать элементы – данные объекта.
Рекомендация:
Для перегрузки операций следует пользоваться функциями-методами. Функции-друзья предназначаются в С++ большей частью для специальных ситуаций.
