В чем разница между типами возврата Reference и Pointer в C++

Если бы я должен был создать простой объект в C++, какая разница между возвращением адреса члена и возвратом указателя. Насколько я знаю, C++ не имеет автоматической сборки мусора, поэтому он не будет вести подсчет ссылок. Итак, почему кто-то сделал бы это так:

class CRectangle {
public:
    string& getName( );
    int&    getWidth( );
    int&    getHeight( );
private:
    string  name;
    int     height;
    int     width;
};

а не так:

class CRectangle {
public:
    string* getName( );
    int*    getWidth( );
    int*    getHeight( );
private:
    string  name;
    int     height;
    int     width;
};

Я понимаю, что это позволит вам получить доступ к данным членов, но я не беспокоюсь о правильной инкапсуляции в этом простом примере. Так какая разница? Ускорение? Читаемость? Стиль?

4 ответа

Решение

& (в этом контексте) не означает "адрес".

Функция объявлена ​​как string& getName( ); возвращает ссылку, а не указатель. Ссылка - это псевдоним другого объекта. Таким образом, в этом случае он не возвращает копию имени объекта или указателя на имя, а ссылку на само имя. Таким образом, любые изменения в возвращаемом объекте применяются непосредственно к имени объекта.

Вы можете достичь того же, вернув указатель, но будет два существенных различия:

  • указатель требует специального синтаксиса для доступа (* а также -> операторы), тогда как ссылка используется точно так же, как и сам объект.
  • указатель может быть null Ссылка не может. Поэтому каждый раз, когда используется указатель, вы сообщаете читателю кода, что "это значение может быть null "

В этом контексте & означает ссылку, а не адрес.

  • Указатель может быть 0 - ссылка не может быть в правильно сформированной программе.
  • Владение может быть более неясным, когда вы возвращаете указатель.
  • Читаемость субъективна - я бы сказал, используйте ссылку, когда можете.
  • Для эффективности нет никакой разницы.

Прежде всего, форма & называется "ссылкой" в C++. Форма * называется "указатель" или "адрес".

Ускорение - без разницы. Читаемость - вероятно, небольшое преимущество для ссылок, отсутствие разыменования в коде upstack.

Стиль - явное нарушение инкапсуляции - достаточно плохой стиль, чтобы скрыть что-либо еще. Если вам нужен объект с голыми данными, то общедоступная структура тоже подойдет.

Нет смысла возвращать указатель на целое число из метода типа свойства, такого как getWidth(), Это добавляет бремя необходимости отслеживать владение памятью; но на самом деле может увеличить пропускную способность возвращаемого типа (оба int Размеры указателя зависят от платформы и могут варьироваться, но типичные размеры составляют 32 и 64 бита соответственно).

Другие вопросы по тегам