Пытаясь понять глубокий текст C ++

0

Я знаю, как писать код, но не могу объяснить смысл кода здесь:

 ArrayList& ArrayList::operator =(const ArrayList& other) {
          delete[] m_elements;
          copy(other);
          return *this; 
 }

1-й вопрос

Я знаю, что ArrayList& означает "передать его по ссылке". Но это первый раз, когда я вижу ArrayList& как возвращаемый тип метода. В чем разница между:

ArrayList ArrayList :: operator() {} 

а также

ArrayList& ArrayList :: operator(){}

Второй вопрос

Что return *this означает? Зачем возвращать указатель? Разве это не должно быть return this; ?

** EDITED

Третий вопрос

Указывает ли этот код ниже: "Этот метод Возвращает некоторый странный адрес памяти (что-то вроде 0x90183930)" по ссылке "?

             ArrayList*& ArrayList ::operator(){}
  • 2
    если вы не можете следовать этому, вы должны начать с более простого оператора =, таким образом, вы не будете отвлекаться на ошибку (в строке 2).
  • 0
    Посмотрите на это, например: int get1X() { return x; } и int& get2X() { return x; } тестирование Во-первых: get1X() = 0 <- ошибка! Второе: get2X() = 0 <-компилируется!
Теги:
deep

2 ответа

0
Лучший ответ

Семантика стандартного присваивания возвращает назначенное значение в результате присвоения.

Поэтому он должен возвращать либо ArrayList, либо const ArrayList &. Более поздняя версия предпочтительна для больших объектов, поскольку она проходит только по адресу, а не по полной копии рассматриваемого значения.

btw, его возвращение * это, так как после завершения задания * это значение, которое было назначено.

  • 0
    Почему возвращенная ссылка должна быть const ? Почему бы не разрешить что-то вроде (array1 = array2) += array3 ? Если вы возвращаете себя в целях создания цепочки, вполне можете позволить это хорошо.
  • 0
    хм, не уверен, что могу с вами полностью согласиться, но я мог бы поработать над этим стилем из руководства по стилю, и я почти вижу, что это полезная вещь.
2

Тип данных, за которым следует амперсанд в C++, является просто ссылкой на объект вместо объекта в целом (который будет копией). Следовательно, ArrayList& является ссылкой на объект типа ArrayList.

Из этого следует второй вопрос. В контексте класса ArrayList this указатель на текущий экземпляр, таким образом, тип ArrayList*. * Перед this разыгрывает этот указатель, в результате чего объект указывает, который действителен для передачи по ссылке, и как таковой соответствует указанному типу возврата ArrayList&.

Если бы он вернул this вместо *this возвращаемый тип должен был быть ArrayList*.

  • 0
    Так что если код изменится на [ArrayList *] с помощью [return this;], то результатом будет «вернуть странный 16-битный адрес Эйнштейна 0x0817393849494849404» правильно ??
  • 0
    Это не 16 бит, но кроме этого да.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню