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