Добрый вечер. У меня такой вопрос, недавно лазил в инете и наткнулся на такой код: 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)));
Приведенные три варианта делают одно и то же.
Комментариев нет:
Отправить комментарий