Указатель this.

Каждый объект содержит свой экземпляр полей класса. Методы класса находятся в памяти в единственном экземпляре и используются всеми объектами совместно. Каждый раз, когда некоторый объект использует метод, необходимо, чтобы этот метод использовал внутри себя поля именно того объекта, который этот метод вызвал. Это обеспечивается передачей в функции-методы скрытого параметра 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);//не нужна для данных стат. размещения