WedX - журнал о программировании и компьютерных науках

по ссылке в C ++

У меня есть этот фрагмент кода

Stack& Stack:: operator=(const Stack& stack){
   if(this == &stack){
      return *this
   }
}

здесь я определяю оператор =, но я не могу понять, если я получаю по стеку ссылок, почему он должен быть & в this == &stack, а не this == stack, и почему мы возвращаем * в return *this, а не this заранее спасибо за любую помощь

c++
28.05.2010

Ответы:


1

Поскольку this является указателем (т. Е. Типа Stack*), а не ссылкой (т. Е. Не типа Stack&).


Мы используем if(this == &stack) только для того, чтобы гарантировать, что утверждение

 s = s;

может обрабатываться правильно (особенно когда вам нужно удалить что-то в старом объекте). Сравнение указателей верно только тогда, когда оба являются одним и тем же объектом. Конечно, мы можем сравнивать и по стоимости

if (*this == stack)
  return *this;
else {
  ...
}

Но операция == может быть очень медленной. Например, если в вашем стеке N элементов, *this == stack выполнит N шагов. Поскольку само задание занимает всего N шагов, это удвоит усилия напрасно.

28.05.2010
  • Собственно, это зависит от того, какое сравнение вы хотите провести. Если вы хотите увидеть, являются ли они одним и тем же объектом, вы делаете this == &stack, но если вы хотите проверить, имеют ли они равные значения, независимо от того, являются ли они одним и тем же объектом, вы делаете *this == stack. 28.05.2010
  • Швы, первый вопрос должен был спросить, почему мы используем &, если мы уже получили ссылку в качестве аргумента. 28.05.2010

  • 2

    stack относится к типу Stack&, а this относится к типу Stack*. Вы проверяете, равен ли адрес stack this.

    28.05.2010

    3

    Краткий ответ на два ваших вопроса.

    1. Насколько я понимаю, вы спрашиваете, почему мы используем знак &, если мы получаем ссылку в качестве параметра функции (а не жалобы). Потому что ссылка на жалкий объект не является его адресом. Вы должны использовать оператор & (), чтобы получить адрес объекта.

    2. this является указателем, но вы должны вернуть ссылку, поэтому вы вернете * this

    28.05.2010

    4

    если я получаю по ссылке стек, почему он должен быть & в этом == & стеке

    Поскольку this является указателем (или «адресом»), а stack является ссылкой (не указателем): поэтому вам нужно сказать &stack (что означает «адрес стека»), чтобы его тип соответствовал типу this.

    почему мы возвращаем * взамен * это, а не это

    Поскольку this является указателем (а не ссылкой), но метод должен возвращать ссылку (а не указатель), поэтому вам нужно уважать его, чтобы превратить указатель в ссылку.

    28.05.2010
    Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: [email protected]