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

270
10 ноября 2017, 09:38

Добрый вечер. У меня такой вопрос, недавно лазил в инете и наткнулся на такой код: 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!"<<endl;        
    exit(0);
}
}
ostream& operator<<(ostream& out,const Fraction &fra){    
  if(fra.fenmu<0)
    out<<"(-"<<fra.fenzi<<"/"<<-fra.fenmu<<")";        //Negative   scores
else if(fra.fenzi<0)
    out<<"(-"<<-fra.fenzi<<"/"<<fra.fenmu<<")";
else if(fra.fenmu==1)
    out<<fra.fenzi;                                    //Integer show
else
    out<<fra.fenzi<<"/"<<fra.fenmu;                    //Positive scores
return out;
}
istream& operator>>(istream& in, Fraction& fra){
   int mu,zi;
   cout<<"Please enter the denominator and numerator"<<endl;
   in>>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);
   }
Answer 1

Автор кода явно экономил на тексте. *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)));

Приведенные три варианта делают одно и то же.

READ ALSO
Проверка введенных данных QTableWidget

Проверка введенных данных QTableWidget

Доброго времени суток коллегиЕсть задача используя QTableWidget проверять введенные пользователем данные в ячейки с помощью нехитрой конструкции

212
Ошибки в библиотеке GLM (C++ Builder)

Ошибки в библиотеке GLM (C++ Builder)

При подключении библиотеки GLM возникают ошибки:

225
Отправить сообщениие

Отправить сообщениие

Имеется следующая функцияНадо чтобы вывелось сообщение на другой странице когда осуществится переход window

243
Как добавить данные во все ajax запросы?

Как добавить данные во все ajax запросы?

Здравствуйте, как можно добавить данные (cscrf token) ко всем ajax запросам?

267