Каждый объект содержит свой экземпляр полей класса. Методы класса находятся в памяти в единственном экземпляре и используются всеми объектами совместно. Каждый раз, когда некоторый объект использует метод, необходимо, чтобы этот метод использовал внутри себя поля именно того объекта, который этот метод вызвал. Это обеспечивается передачей в функции-методы скрытого параметра this – это указатель на вызвавший функцию объект, он используется внутри метода для ссылок на элементы объекта. В явном виде этот указатель используется для возвращения из метода указателя (return this;) или ссылки на вызвавший объект (return *this;)
// fractiongl.cpp 3-ий файл Главная программа
#include "fraction.h"
ofstream fout;
int main()
{fout.open("res1.txt”); if(fout.fail()){cout<<"oshibka res1.txt";return 2;}
fout<<” frac ff;”<<endl;
frac ff;
fout<<” frac a(2,4),b(2,3);”<<endl;
frac a(2,4),b(2,3);
fout<<” a.show();”<<endl;
a.show();
fout<<” frac c(4,3),d(2,5);”<<endl;
frac c(4,3),d(2,5);
fout<<” frac x,t;”<<endl;
frac x,t;
fout.close();
return 0;
}
Файл res1.txt (1 часть)
frac ff;
frac()={0/1}
frac a(2,4),b(2,3);
Do reduce()...
Reduce()={1/2}
frac (const frac &[{1/2}])={1/2}
Destructor ~frac() for {1/2}
frac (int a, unsigned int b)
Do reduce()...
Reduce()={2/3}
frac (const frac &[{2/3}])={2/3}
Destructor ~frac() for {2/3}
frac (int a, unsigned int b)
a.show();
{1/2}
show()
frac c(4,3),d(2,5);
Do reduce()...
Reduce()={4/3}
frac (const frac &[{4/3}])={4/3}
Destructor ~frac() for {4/3}
frac (int a, unsigned int b)
Do reduce()...
Reduce()={2/5}
frac (const frac &[{2/5}])={2/5}
Destructor ~frac() for {2/5}
frac (int a, unsigned int b)
frac x,t;
frac()={0/1}
frac()={0/1}
____________________________________-
Файлfraction.h – интерфейсный файл класса (продолжение 1)
//некоторые функции (возможные варианты сложения дробей )
17) void addfrac(frac &a, frac &b);
18) frac addfrac (frac &a);
Файл fractionR.cpp – файл реализации (продолжение 1)
17) void frac::addfrac(frac &a,frac &b)
{ fout<<"Do addfrac(frac &["<<a<<"],frac &["<<b<<"])..."<<endl;
p=a.p*b.q+a.q*b.p;q=a.q*b.q;
fout<<"Result={"<<p<<'/'<<q<<"}"<<endl;
reduce(); //p, q, reduce() относятся к объекту, для которого
} // вызвана функция
-------------------------------------------------------------------------------------
Раньше было:
frac frac::addfrac(frac &a,frac &b)
{ fout<<"Do addfrac(frac &["<<a<<"],frac &["<<b<<"])..."<<endl;
p=a.p*b.q+a.q*b.p;q=a.q*b.q;
fout<<"Result={"<<p<<'/'<<q<<"}"<<endl;
reduce(); //p, q, reduce() относятся к объекту, для которого
return *this;} // вызвана функция
//x=p3.addfrac(p1,p2);
Do addfrac(frac &[{2/3}],frac &[{4/3}])...
Result={18/9}
Do reduce()...
Reduce()={2/1}
frac (const frac &[{2/1}])={2/1}
Destructor ~frac() for {2/1}
//p3.show();
{2/1}
___________________________________________________
18) frac frac::addfrac (frac &a) //сумма вычисляется путем
{return frac(p*a.q+a.p*q,q*a.q); } // сложения 2-х дробей: 1- к
// которой применяется метод,
//2-я –параметр функции
Файл fractiongl.cpp (продолжение 1)
Вызов 17) функции x.addfrac(b,c); //2/3 +4/3 =2/1
x.show();
Do addfrac(frac &[{2/3}],frac &[{4/3}])...
Result={18/9}
Do reduce()...
Reduce()={2/1}
Вызов 18) функции :x=b.addfrac(c) ; //2/3 +4/3 =2/1
x.show();
Do reduce()...
Reduce()={2/1}
frac (int a, unsigned int b)
Destructor ~frac() for {2/1}
___________________________________________________
Файлfraction.h – интерфейсный файл класса (продолжение 2)
Гораздо удобнее перегрузка операции для объекта класса, она выглядит так:
тип operator операция (список параметров) {тело функции}
При перегрузке операции сохраняются количество аргументов, приоритеты операций и правила ассоциации, не переопределяются для стандартных типов данных. Функция-операция может быть либо методом класса, либо дружественной функцией класса, либо обычной функцией, хотя бы один аргумент д.б. типа класса, указателя либо ссылки на класс.
frac operator +(frac &); //x=a+b;
bool operator <(frac &);
frac& operator=(frac);//не нужна для данных стат. размещения