Добрый вечер. У меня такой вопрос, недавно лазил в инете и наткнулся на такой код: 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);
}
Автор кода явно экономил на тексте. *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)));
Приведенные три варианта делают одно и то же.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Доброго времени суток коллегиЕсть задача используя QTableWidget проверять введенные пользователем данные в ячейки с помощью нехитрой конструкции
Имеется следующая функцияНадо чтобы вывелось сообщение на другой странице когда осуществится переход window
Здравствуйте, как можно добавить данные (cscrf token) ко всем ajax запросам?