Страницы

Поиск по вопросам

четверг, 4 апреля 2019 г.

Указатель this c++

Добрый вечер. У меня такой вопрос, недавно лазил в инете и наткнулся на такой код: return*this*Fraction(fra.fenm, fra.fenzi); где fenm-числитель, а fenzi-знаменатель. Хотелось бы узнать, что означает такая запись *this*. Это указатель на класс или конструктор? Вот тот самы код. Если что есть ссылка ссылка на код
Заранее спасибо.
Fraction::Fraction(int zi,int mu):fenzi(zi),fenmu(mu){ if(mu==0){ cout<<"The denominator can not be 0!"<>(istream& in, Fraction& fra){ int mu,zi; cout<<"Please enter the denominator and numerator"<>mu>>zi; fra.setValue(mu,zi); return in; } void Fraction::setValue(int mu,int zi){ fenmu=mu; fenzi=zi; } Fraction Fraction::operator+(const Fraction &fra)const{ int a=fenzi,b=fenmu; //▲▲▲A key▲▲▲ //Be sure to use the const, not because it will make the last operational data assigned to the next operation in l-value //Because the const function cannot change the class of internal variables, so use avatars, if here with friend heavy load //It can effectively avoid this problem, because the friend overloaded operators have two reference parameters a=fra.fenmu*fenzi+fra.fenzi*fenmu; b*=fra.fenmu; int g=GreatestCommonDivisor(a,b); if (g!=1) { a/=g; b/=g; } return Fraction(a,b); } Fraction Fraction::operator-(const Fraction &fra)const{ int a=fenzi,b=fenmu; a=fra.fenmu*fenzi-fra.fenzi*fenmu; b*=fra.fenmu; int g=GreatestCommonDivisor(a,b); if (g!=1) { a/=g; b/=g; } return Fraction(a,b); } Fraction Fraction::operator*(const Fraction &fra)const{ int a=fenzi,b=fenmu; a*=fra.fenzi; b*=fra.fenmu; int g=GreatestCommonDivisor(a,b); if (g!=1) { a/=g; b/=g; } return Fraction(a,b); } Fraction Fraction::operator/(const Fraction &fra)const{ return *this*Fraction(fra.fenmu,fra.fenzi); }


Ответ

Автор кода явно экономил на тексте. *this - это просто разыменование указателя, дающее ссылку const Fraction & на данный экземпляр класса, а последующий * - это перегруженный оператор умножения. Оператор деления реализован как умножение на обратную величину. Если добавить скобочек и пробелов, то должно получатся нагляднее:
return((*this) * Fraction(fra.fenmu, fra.fenzi));
также перегруженный оператор умножения можно вызвать как функцию:
return(operator *(Fraction(fra.fenmu, fra.fenzi)));
или с явным this
return(this->operator *(Fraction(fra.fenmu, fra.fenzi)));
Приведенные три варианта делают одно и то же.

Комментариев нет:

Отправить комментарий