Страницы

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

воскресенье, 2 февраля 2020 г.

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

#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))); Приведенные три варианта делают одно и то же.

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

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