Указатели против ссылок C ++ - PullRequest
0 голосов
/ 30 декабря 2018

Я медленно, но верно прорабатывал главы LearnCpp.com, изучая C ++.У меня возникла путаница из-за различий между указателем и ссылкой на переменную.

Вот пример:

[код]

Fraction& Fraction::operator= (const Fraction &fraction)
{
    // self-assignment guard
    if (this == &fraction)
        return *this;

    // do the copy
    m_numerator = fraction.m_numerator;
    m_denominator = fraction.m_denominator;

    // return the existing object so we can chain this operator
    return *this;
}

[/ code]

Итак, эта функция для перегрузки оператора =, возвращает ли она адрес дроби или ссылку на дробь?

, возвращая * this в конце функции, является лиэто означает, что это адрес?Кроме того, я подумал, что «* this» является опровержением и приведет к тому, что будут указаны фактические данные.Так он возвращает адрес или фактические данные, на которые указывают?

И наконец, в выражении if «self assignment» if (this == & фракция) я всегда читаю «&» в списке параметров как «ссылку на переменную».Но это утверждение сравнивает его с «этим», которое является переменной-указателем.Так это указатель ("& дробь") или адрес?Означает ли включение «&» в тело функции значения данных, на которые указывают?

Пожалуйста, проясните эти вопросы.Это действительно помогло бы мне.Спасибо.

Дин.

1 Ответ

0 голосов
/ 30 декабря 2018

Итак, эта функция для перегрузки оператора =, возвращает ли она адрес дроби или ссылку на дробь?

Возвращает ссылку на Fraction.Предполагается, что начало функции (или оператора) имеет тип возврата (пока игнорируем template s).Здесь мы можем видеть Fraction&, который является ссылкой на Fraction.

, возвращая * this в конце функции, это то, чтоозначает, что это адрес?

Возвращение *this означает, что функция возвращает то, на что указывает указатель this.Это буквально этот объект.Учитывая тот факт, что возвращаемый тип является ссылкой , оператор будет возвращать ссылку на этого самого объекта .Он не возвращает никаких адресов.

Я всегда читаю «&» в списке параметров как «ссылку на» переменную

Вы действительно не должны.& в сочетании с переменными (не типов ) является оператором address-of .В этом случае:

if (this == &fraction)

проверяет, является ли этот самый объект (тот, на который указывает указатель this) тот же объект, который передан в функцию как аргумент fraction,fraction является ссылкой, что означает, что ее адрес будет таким же, как адрес объекта, к которому привязана ссылка.Это эффективно проверяет , пытались ли вы присвоить объект себе (учитывая тот факт, что этот код выполняется в операторе присваивания).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...